私は最近、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();
}
[JAX-WS - 例外へのマップの例外](https://stackoverflow.com/questions/2064447/jax-ws-map-exceptions-to-faults)の可能な複製 – Optional
Java 6はTLS 1.2をサポートし、以下をチェックしてください http://www.oracle.com/technetwork/java/javase/overview-156328.html#R160_121 –
@ LAKHDAR Omar TLSv1.2をサポートするJava 6のバージョンがあることを知っています。残念ながら、JDKのこれらのバージョンは、私が知っている公に利用可能ではありません。それらを入手する唯一の方法は、Oracleとの有償サポート契約です。私がそれについて間違っていて、java 6 jdkの新しいバージョンにアクセスするための評判の良い方法がある場合は、教えてください。 – pbuchheit