web-dev-qa-db-ja.com

私のwsdlを作成するJAXBContextを作成できません

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クラスを使用します。

20
Edwin Jaws

Throwableオブジェクト(例外とエラーを意味する)は、XMLにシリアル化できないため、直接転送できません(StackTraceElementには引数なしのコンストラクタがありません。 JAXBで必要)。

そのためにSOAP faultsを使用する必要があります。 this question を参照してください。例外クラスに追加する必要がある@WebFault注釈を示しています。 (おそらく thisthis )も確認してください)

15
Bozho

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で修正されています

9
Jeff Vincent

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>
5
abhijeet mane

宣言されたAPIの一部に、StackTraceElement []型の内部フィールドを持つ型を拡張する型が含まれているようです。

StackTraceElementには引数なしのコンストラクタがないため、JAXBはこのクラスのインスタンスを逆シリアル化できません。

SQLExceptionBeanからnextExceptionフィールドを削除するか、サービスAPIからSQLExceptionBean型のパラメーターを削除してください。

3
Adrian

カスタム例外を作成する必要がないことに注意してください。クラスを生成するときに適切なバージョンの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>
2
Domenic D.

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>
2
Domenic D.

私もこの問題を抱えていました!まったく同じ!

このエラーをご覧ください、

 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の最初の答えに従ってください。

1
user2710368