2017-11-22 22 views
2

私は最近、UPS Tracking APIに依存するレガシーアプリケーションの問題に遭遇しました。 UPSは通信プロトコルをTLSv1.2を要求するように変更しました。残念ながら、最新版のjdk 1.6はこのプロトコルをサポートしていないようですので、私のオプションはoracleサポート契約またはjdk 1.7へのアップグレードに費やすことでした。私は1.7にアップグレードしましたJava 1.6から1.7に切り替えるとJAXB例外が発生する

私は私のプロジェクトの依存関係を変更し、すべてがうまく見えました。私は実際にそれがエラーで失敗しましたアプリケーションサーバーにデプロイしようとしたとき:

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.lang.StackTraceElement does not have a no-arg default constructor

私はいくつかの研究を行なったし、明らかに問題がJAXBによって引き起こされるたThrowableで例外をスロー注釈付きメソッドが@WebMethod。その解決策(私は思った)は例外クラスに@WebFaultアノテーションを追加することでした。私はここに指示に従った:http://java.globinch.com/enterprise-java/web-services/jax-ws/jax-ws-exceptions-faults-annotation-exception-and-fault-handling-examples/ と再展開。

結果に同じエラーがありました。唯一の違いは、stacktraceが、ラッパーを生成しようとするのではなく、自分のカスタムfault beanを使用していることを示していることです。私はまた、ここに与えられた解決策を見ました:map exceptions to faultsそして私が言うことができる限り、私のクラスは仕様を満たしていますが、問題は解決しません。

この問題は、私がUPSの問題を解決してユーザーに重大な頭痛を引き起こさないようにしています。どんな助けでも大歓迎です。

マイエラーログ

Caused by: org.jboss.ws.WSException: Failed to create JAXBContext at jaxb.hibernate.XMLAcccesorAvailableContextFactory.createContext(XMLAcccesorAvailableContextFactory.java:41) at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilder.createJAXBContext(JAXWSMetaDataBuilder.java:940) ... 82 more Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.lang.StackTraceElement does not have a no-arg default constructor. this problem is related to the following location: at java.lang.StackTraceElement at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace() at java.lang.Throwable at private java.lang.Throwable[] com.tura.common.server.service.addressvalidation.AddressServiceFault.suppressed at com.tura.common.server.service.addressvalidation.AddressServiceFault

at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:106)

例外クラス

@WebFault(faultBean = "com.tura.common.server.service.addressvalidation.AddressServiceFault") 
public class AddressValidationServiceException extends Exception { 

    private AddressServiceFault faultInfo; 

    public AddressValidationServiceException() { 
     super(); 
    } 
    public AddressValidationServiceException(AddressServiceFault fault) { 
     super(fault.getFaultString()); 
     this.faultInfo = fault; 
    } 

    public AddressValidationServiceException(String message, AddressServiceFault fault) { 
     super(message); 
     this.faultInfo = fault; 
    } 

    public AddressValidationServiceException(String message, Throwable cause) { 
     super(message, cause); 
    } 

    public AddressValidationServiceException(String message, AddressServiceFault fault, Throwable cause) { 
     super(message, cause); 
     this.faultInfo = fault; 
    } 

    protected AddressServiceFault getFaultInfo() { 
     return faultInfo; 
    } 
} 

障害Beanクラス

public class AddressServiceFault { 

    private String faultCode; 

    private String faultString; 

    protected String getFaultCode() { 
     return faultCode; 
    } 

    protected void setFaultCode(String faultCode) { 
     this.faultCode = faultCode; 
    } 

    protected String getFaultString() { 
     return faultString; 
    } 

    protected void setFaultString(String faultString) { 
     this.faultString = faultString; 
    } 
} 

あなたの例外クラスがgetStackTraceメソッド()およびgetCause()メソッドをオーバーライドする必要があるようマイWebServiceクラスは

@WebMethod 
    public @WebResult(name = "validatedAddresses") String parseAddressStringByLocation(
      @WebParam(name = "sLocation") String sLocation) throws AddressValidationServiceException { 
     StringBuffer sbUrl = new StringBuffer(); 
     StringBuffer sbQueryString = new StringBuffer(); 

     sbUrl.append("http://test.foo.com"); 

     try { 
      sbQueryString.append("&location="); 
      sbQueryString.append(URLEncoder.encode(sLocation, "UTF-8")); 
     } catch (UnsupportedEncodingException e) { 
      AddressServiceFault serviceFault = new AddressServiceFault(); 
      serviceFault.setMessage("Validation Failed"); 
      throw new AddressValidationServiceException("Address Validation Error: parseQueryStringByLocation.", 
        serviceFault, e); 
     } 

     sbUrl.append(sbQueryString); 

     return sbUrl.toString(); 
    } 
+0

[JAX-WS - 例外へのマップの例外](https://stackoverflow.com/questions/2064447/jax-ws-map-exceptions-to-faults)の可能な複製 – Optional

+0

Java 6はTLS 1.2をサポートし、以下をチェックしてください http://www.oracle.com/technetwork/java/javase/overview-156328.html#R160_121 –

+0

@ LAKHDAR Omar TLSv1.2をサポートするJava 6のバージョンがあることを知っています。残念ながら、JDKのこれらのバージョンは、私が知っている公に利用可能ではありません。それらを入手する唯一の方法は、Oracleとの有償サポート契約です。私がそれについて間違っていて、java 6 jdkの新しいバージョンにアクセスするための評判の良い方法がある場合は、教えてください。 – pbuchheit

答えて

1

誰も解決策を思い付いていないように見えるので、私は先に進み、これをどのように修正したかを投稿します。 JAX-WSは、リフレクションを使用して、例外クラスをラップするかどうかを決定します。その結果、例外に含まれるコンストラクタとメソッドについては非常に厄介です。

protected AddressServiceFault getFaultInfo() { 
     return faultInfo; 
    } 

問題はその方法の可視性である:あなたがAddressValidationServiceExceptionクラスをよく見た場合、あなたはそれがこの方法を持っていることがわかります。 getFaultInfo()はpublicメソッドでなければなりません。そうしないと、jax-wsは例外クラスを正しく認識してラップしません。私がそのメソッドをpublicに変更するとすぐに、すべてが動作するようになりました。実際、@WebFaultアノテーションを完全に削除することができました。例外クラスとフォルトが正しくフォーマットされている限り、明示的な注釈は必要ありません。

他にも知っておくべき1つの「つまらない」。 Javaコンストラクタは継承されません。あなたの例外を拡張する追加のクラスを持っている場合は、階層内の各クラスは、明示的に

public MyClass(String message, MyServiceFault fault) 

public MyClass(String message, MyServiceFault fault, Throwable cause) 

コンストラクタを定義する必要があります。

0

に思えます。 hereを見て、Domenic D.の回答が解決策になるかもしれません。

jaxb-implバージョンにも問題がある可能性があります。これについても説明します。

0

StackTraceElementには、JAXBで必要とされる引数のないコンストラクタがないため、ThrowableオブジェクトをXMLに直接シリアル化することはできません。

カスタムSOAPフォルト(@WebFaultでアノテートされたクラス)を使用し、soapFaultの下にdetail要素を持つ例外の詳細を送信します。

+0

提案をいただきありがとうございます。しかし、私が投稿したコードをもう一度見れば、それはまさに私がやっていることです。 – pbuchheit

+0

AddressServiceFaultに値を設定してからAddressValidationServiceExceptionに設定し、AddressValidationServiceExceptionをスローするコードは表示されません。あなたのサービスのメソッドでは、getValidAddressXMLByLocationは例外をキャッチし、AddressServiceFaultに値を設定してAddressValidationServiceExceptionに設定してからスローします。 –

+0

例外が実際にスローされるコードを含めるようにサンプルを更新しました。例外を実装して投げることが原因ではないようです。 – pbuchheit

関連する問題