Webサービス用にWSDLを生成しようとしていますが、このエラーが表示されます。
注:ap round:2 スレッド "main"の例外javax.xml.ws.WebServiceException:com.Sun.xml.internal.wsでJAXBContext を作成できません。 model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.Java:153) at com.Sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.Java:83) at com.Sun。 xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.Java:244) com.Sun.tools.internal.ws.wscompile.WsgenTool.buildModel(WsgenTool.Java:229) com.Sun.tools.internal.ws.wscompile.WsgenTool.run(WsgenTool.Java:112) at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at Sun.reflect .NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39) at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25) at Java.lang.reflect.Method.invoke(Method.Java :597) com.Sun.tools.internal.ws.Invoker.invoke(Invoker.Java:105) at com.Sun.tools.internal.ws.WsGen.main(WsGen.Java:41) 原因:Java.security.PrivilegedActionException:com.Sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1カウントのIllegalAnnotationExceptions Java.lang.StackTraceElementには引数なしのデフォルトコンストラクターがない。 この問題は次の場所に関連しています。 at Java.lang.StackTraceElement at public Java.lang.StackTraceElement [] Java.lang.Throwable.getStackTrace() at Java.lang.Throwable at Java.lang.Exception at Java.sql.SQLException at private Java.sql.SQLException wsdb.jaxws.SQLExceptionBean。 nextException at wsdb.jaxws.SQLExceptionBean at Java.security.AccessController.doPrivileged(Native Method) at com.Sun .xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.Java:140) ...さらに10 原因:com.Sun.xml.internal.bind.v2.runtime .IllegalAnnotationsException:1カウントのIllegalAnnotationExceptions Java.lang.StackTraceElementには引数なしのデフォルトコンストラクターはありません。 この問題は、Java.langの に関連しています。 .StackTraceElement at public Java.lang.StackTraceElement [] Java.lang.Throwable.getStackTrace() at Java.lang.Throwable at Java.lang.Exception Java.sql.SQLException at private Java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException at wsdb.jaxws.SQLExceptionBean at com .Sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException $ Builder.check(IllegalAnnotationsException.Java:91) at com.Su n.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.Java:436) at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl。(JAXBContextImpl.Java:277 ) at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl $ JAXBContextBuilder.build(JAXBContextImpl.Java:1100) at com.Sun.xml.internal.bind.v2 .ContextFactory.createContext(ContextFactory.Java:143) com.Sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.Java:95) at com.Sun.xml .internal.ws.developer.JAXBContextFactory $ 1.createJAXBContext(JAXBContextFactory.Java:97) at com.Sun.xml.internal.ws.model.AbstractSEIModelImpl $ 1.run(AbstractSEIModelImpl.Java:148) at com.Sun.xml.internal.ws.model.AbstractSEIModelImpl $ 1.run(AbstractSEIModelImpl.Java:140) ... 12 more
これについては、別のxml仕様を作成するまで、すべてのクラスのコンストラクターを作成することから始めて、インターネットでいくつかの議論がありました。真実は、これに対する本当の答えがないか、私がテストした解決策がまったく機能しないということです。
ここでこの問題に関する議論を読みましたが、それは終了しておらず、解決方法がわかりません。誰かがこれについての手がかりを持っている場合、これを避けるために私を厳密な方向に追加することをとても感謝しています。
Debian Squezzeを使用しています。Java 1.6_20、JDK 6のJAX-WS JAX-WS RI 2.1.6およびwsgenでwsdlを生成しました。最初のステップは正しく、jaxwsディレクトリを生成しますBeanクラスを使用します。
Throwable
オブジェクト(例外とエラーを意味する)は、XMLにシリアル化できないため、直接転送できません(StackTraceElement
には引数なしのコンストラクタがありません。 JAXBで必要)。
そのためにSOAP faultsを使用する必要があります。 this question を参照してください。例外クラスに追加する必要がある@WebFault
注釈を示しています。 (おそらく this と this )も確認してください)
Domenic D.には正しい答えがありましたが、それを拡張したいと思います。
私のMavenプロジェクトはJDK 6で問題なくビルドされましたが、デフォルトとしてJDK 1.7を使用するように切り替えたときに、ビルドが失敗しました。バージョン付きの明示的なjaxb-impl依存関係を追加することで、次のように機能しました。
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<dependencies>
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.6</version>
</dependency>
</dependencies>
<executions>
<execution>
...
</execution>
</executions>
</plugin>
バージョンについて:このバグは https://Java.net/jira/browse/JAXB-814 にリストされています。バージョン2.2.4u2、2.2.5、2.3で修正されています
Jaxb-implバージョンを2.1.9から2.2.6に修正することでこの問題を解決しましたが、現在は正常に動作します
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.6</version>
</dependency>
宣言されたAPIの一部に、StackTraceElement []型の内部フィールドを持つ型を拡張する型が含まれているようです。
StackTraceElementには引数なしのコンストラクタがないため、JAXBはこのクラスのインスタンスを逆シリアル化できません。
SQLExceptionBeanからnextExceptionフィールドを削除するか、サービスAPIからSQLExceptionBean型のパラメーターを削除してください。
カスタム例外を作成する必要がないことに注意してください。クラスを生成するときに適切なバージョンのJAXBを使用するようになりました。例えば:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.12</version>
<dependencies>
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.5</version>
</dependency>
</dependencies>
<executions>
<execution>
...
</execution>
</executions>
</plugin>
StackTraceにはデフォルトのコンストラクタがないため、Exception/ThrowableクラスはJAXBによってマーシャリングできないことが知られています。できることは、例のWebServiceExceptionから拡張した独自のExceptionクラスを作成することです。クラスで、StackTraceを使用するメソッドをオーバーライドし、@XmlTransient
それらへの注釈。 JAXB 2.2.4u2 +を使用している限り、マーシャラーは@XmlTrasient
カスタムクラスの注釈。
追加の詳細は http://Java.net/jira/browse/JAXB-814 で入手できます。これは、@XmlTransient
はサブクラスではうまく機能しませんでした。
以下は適切にマーシャルするサンプルクラスです。
package com.stackoverflow.7232331;
import javax.ws.rs.core.Response.Status;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
@XmlRootElement
public class CustomException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = -672804070691541883L;
protected String reason;
protected Status status;
protected int errorCode;
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
public CustomException(Status status, String message, String reason, int errorCode) {
super(message);
this.reason = reason;
this.status = status;
this.errorCode = errorCode;
}
public CustomException() {
super();
}
@XmlTransient
@Override
public StackTraceElement[] getStackTrace() {
return super.getStackTrace();
}
@XmlTransient
@Override
public Throwable getCause() {
return super.getCause();
}
}
Mavenを使用する場合、この依存関係が必要になります。
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.5</version>
</dependency>
私もこの問題を抱えていました!まったく同じ!
このエラーをご覧ください、
at Java.lang.StackTraceElement
at public Java.lang.StackTraceElement[] Java.lang.Throwable.getStackTrace()
at Java.lang.Throwable
at Java.lang.Exception
at Java.sql.SQLException
at private Java.sql.SQLException wsdb.jaxws.SQLExceptionBean.nextException
at wsdb.jaxws.SQLExceptionBean
私は自分のコードを調べて、理由を確認しました
@WebMethod(operationName = "reportnewplace")
public String reportnewplace(@WebParam(name = "xcmc") String xcmc,
@WebParam(name = "address") String address,
@WebParam(name = "lon") String lon,
@WebParam(name = "lat") String lat,
@WebParam(name = "UID") String UID) throws SQLException{
Webメソッドは例外をスローするべきではありません。removeはこの問題を簡単に解決します。もしそうなら、@Bozhoの最初の答えに従ってください。