web-dev-qa-db-ja.com

JAXB Random ClassCastExceptionのNetbeansは、com.Sun.xml.bind.v2.runtime.reflect.Accessorにキャストできません。

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コンパイラー構成で承認済みフォルダーを使用するなど、他のオンライン提案を試しましたが、それでも発生します

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

ありがとう

22
Farouk Alhassan

次のコードで解決

@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
34
Farouk Alhassan

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

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

5
Ritzbot

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>
1
L42

Build.sbtから個別のjaxb-impljarへの依存関係を削除しました。それは今うまくいきます。

1
sam22

アプリケーションの1つで同じ問題が発生しました。私の場合、プロジェクトはJava 1.5互換性でコンパイルされたライブラリを使用していましたが、メインプロジェクトはバージョン1.6と互換性がありました。両方を1.6を使用するように変更すると、問題は解決しました。問題は非常に苛立たしく、追跡が難しい場合があるため、誰かを助けることができます。

1
DDRider62

同様の問題がありましたが、dependeny(-version-mismatch)-問題はありませんでした。

私の場合、クラスに @ XmlAccessorType がありませんでした。このアノテーションを追加すると、問題が解決しました。あなたのケースに適応すると、解決策は次のようになります。

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(XmlAccessType.FIELD) // check, if @XmlAccessorType is missing
public class GetClientByAccountResponse {
  ..
0
Markus Schulte