20

Webサービス用のWSDLを生成しようとしていますが、次のエラーが発生します。

注:apラウンド:2
スレッド「メイン」の例外javax.xml.ws.WebServiceException:JAXBContextを作成できません
        com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:153)で
        com.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:83)で
        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)で
        sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で
        sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)で
        sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で
        java.lang.reflect.Method.invoke(Method.java:597)で
        com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:105)で
        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には、引数なしのデフォルトコンストラクターがありません。
        この問題は、次の場所に関連しています。
                java.lang.StackTraceElementで
                public java.lang.StackTraceElement [] java.lang.Throwable.getStackTrace()で
                java.lang.Throwableで
                java.lang.Exceptionで
                java.sql.SQLExceptionで
                プライベートjava.sql.SQLExceptionwsdb.jaxws.SQLExceptionBean.nextExceptionで
                wsdb.jaxws.SQLExceptionBeanで

        java.security.AccessController.doPrivileged(ネイティブメソッド)で
        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で
                public java.lang.StackTraceElement [] java.lang.Throwable.getStackTrace()で
                java.lang.Throwableで
                java.lang.Exceptionで
                java.sql.SQLExceptionで
                プライベートjava.sql.SQLExceptionwsdb.jaxws.SQLExceptionBean.nextExceptionで
                wsdb.jaxws.SQLExceptionBeanで

        com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException $ Builder.check(IllegalAnnotationsException.java:91)で
        com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:436)で
        com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl。(JAXBContextImpl.java:277)で
        com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl $ JAXBContextBuilder.build(JAXBContextImpl.java:1100)で
        com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143)で
        com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:95)で
        com.sun.xml.internal.ws.developer.JAXBContextFactory $ 1.createJAXBContext(JAXBContextFactory.java:97)で
        com.sun.xml.internal.ws.model.AbstractSEIModelImpl $ 1.run(AbstractSEIModelImpl.java:148)で
        com.sun.xml.internal.ws.model.AbstractSEIModelImpl $ 1.run(AbstractSEIModelImpl.java:140)で
        ...さらに12

これについてインターネットでいくつかの議論がありましたが、最初はすべてのクラスのコンストラクターを構築してから、別のxml仕様を作成するまでです。真実は、これに対する本当の答えがないか、私がテストした解決策がまったく機能しないということです。

私はこの問題についてここで議論を読みましたが、それは終わりがなく、解決する方法がわかりません。誰かがこれについての手がかりを持っているなら、私はこれを避けるために私を厳密な方向に追加することをとても感謝しています。

私は、Debian Squezze、Java 1.6_20、JAX-WS JAX-WS RI2.1.6をJDK6で使用し、wsgenを使用してwsdlを生成しています。それが修正した最初のステップは、Beanクラスを含むjaxwsディレクトリを生成することです。

4

8 に答える 8

16

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

そのためには SOAP フォールトを使用する必要があります。この質問を参照してください。@WebFault例外クラスに付ける必要がある注釈を示します。(おそらくこれこれもチェックしてください)

于 2011-10-26T07:27:47.227 に答える
11

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

于 2013-02-25T17:28:37.643 に答える
9

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>
于 2015-02-04T11:14:09.177 に答える
3

カスタム例外を作成する必要はないことに注意してください。クラスを生成するときは、正しいバージョンの 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>
于 2012-07-23T15:50:28.050 に答える
3

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

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

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

于 2011-10-25T17:37:53.787 に答える
2

StackTrace にはデフォルトのコンストラクターがないため、例外/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>
于 2012-04-27T16:24:21.413 に答える
1

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

このエラーを参照してください。

 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による最初の回答に従ってください.

于 2014-06-30T02:28:07.837 に答える