22

SOAP サービスから SOAP メッセージをダウンロードし、ダウンロードしたメッセージを返すことで SOAP サービスをモックしようとしています。次のコードは、Soap メッセージを必要な応答にアンマーシャリングする方法を示しています。

    public static DataClientType unmarshallFile(String fileName) throws Exception {
    XMLInputFactory xif = XMLInputFactory.newFactory();
    XMLStreamReader xsr = xif.createXMLStreamReader(ClientSampleSoapResponseData.class.getResourceAsStream(fileName));
    xsr.nextTag(); // Advance to Envelope tag
    xsr.nextTag(); // Advance to Header
    xsr.nextTag(); // Advance to Body tag
    xsr.nextTag(); // Advance to getClientByAccountResponse
    xsr.nextTag(); // Advance to content of getClientByAccountResponse

    JAXBContext jc = JAXBContext.newInstance(GetClientByAccountResponse.class);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    JAXBElement<GetClientByAccountResponse> je = unmarshaller.unmarshal(xsr, GetClientByAccountResponse.class);

    return je.getValue().getClientDataContract();
}

ただし、ランダムに発生するこの ClassCastExeption を取得し続けます。何度もテストを繰り返した後、それが起こり始めます。クリーンアップとビルドで修正されることもありますが、うまくいかないこともあります。

java.lang.ClassCastException: com.x.X.X.X.GetClientByAccountResponse$JaxbAccessorF_clientDataContract cannot be cast to com.sun.xml.bind.v2.runtime.reflect.Accessor
at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:188)
at com.sun.xml.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:180)
at com.sun.xml.bind.v2.runtime.reflect.Accessor$FieldReflection.optimize(Accessor.java:256)
at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.<init>(SingleElementNodeProperty.java:90)

古いjaxbバージョンに戻したり、mavenコンパイラ構成で承認されたフォルダーを使用したりするなど、他のオンライン提案を試しましたが、それでも発生します

それを引き起こしている可能性のあるものと可能な解決策についてのアイデアはありますか?

ありがとう

4

8 に答える 8

38

次のコードで解決

@BeforeClass
public static  void init(){ 
    System.setProperty( "com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");
}

@AfterClass
public static void revert(){ 
    System.getProperties().remove("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize");
}    

パラメータは、JVMで次を使用して設定することもできます

-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
于 2013-03-23T03:47:36.457 に答える
5

JAXB を JDK に付属のバージョンよりも新しいバージョンにアップグレードしようとしたときに、同じエラーが発生しました。Java は、実行時に JAXB の 2 つ以上のインスタンスを検出し、使用するバージョンを決定できませんでした。

私の場合、問題はアプリケーションが Web サービスを使用していたことであり、JAX-WS も外部化していませんでした。このアプリケーションは最初は com.sun.xml.bind.v2.runtime クラスを使用していましたが、WSDL ファイルを処理し始めると、内部の JAX-WS が com.sun.xml を呼び出そうとしました。内部.bind.v2.runtime クラス。JAX-WS をダウンロードしてインストールすると、エラーはなくなり、アップグレードを続行できました。

于 2014-11-25T04:19:46.343 に答える
1

受け入れられた解決策は、Intellij では機能しましたが、コマンド ラインから maven を実行すると同じエラーが発生しました。これを構成に追加するとmaven-surefire-plugin、問題も解決されます。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <systemPropertyVariables>
                    <com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize>true</com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize>
                </systemPropertyVariables>
            </configuration>
        </plugin>
于 2016-12-22T14:41:11.003 に答える
-3

親 pom の依存関係マネージャーを介して実行時に jaxbiimpl jar を含めると、この問題は解決します。このソリューションは、Maven プロジェクトに固有のものです。

于 2015-01-09T18:48:38.293 に答える