2013-03-22 9 views
17

umgewandelt werden Ich habe die Soap-Nachrichten von einem SOAP-Service heruntergeladen und versucht, den Soap-Dienst zu verspotten, indem er die heruntergeladenen zurückgibt Mitteilungen. Der folgende Code zeigt, wie ich die SOAP-Nachricht in die gewünschte AntwortNetbeans mit JAXB Random ClassCastException .. kann nicht in com.sun.xml.bind.v2.runtime.reflect.Accessor

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(); 
} 

Jedoch habe ich diesen ClassCastExeption erhalte ich unmarshalling die zufällig passiert. Nach einer Reihe von Testiterationen beginnt es zu passieren. Manchmal behebt ein Clean und Build es, aber manchmal funktioniert es nicht.

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) 

Ich habe andere Online-Vorschläge versucht, wie zu alten jaxb Versionen zurückkehren und mit Hilfe unterstützten Ordner in der Maven-Compiler-Konfiguration, aber es passiert immer noch

Alle Ideen, was könnte es und mögliche Lösungen verursachen?

Thank u

+1

@TheDownVoter Wenn Sie Leute Fragen nach unten gehen, geben Sie mindestens einen Grund oder schlagen Sie etwas vor! Denken Sie daran, dass wir nicht alle so schlau sind wie Sie. –

Antwort

23

mit dem folgenden Code Gelöst

@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"); 
}  

Parameter auch bei JVM eingestellt werden kann, in einem meiner Anwendungen mit

-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true 
+0

Wow! Du hast mir mit dieser Lösung sehr geholfen! Haben Sie untersucht, warum diese Optimierung so viele Probleme verursacht hat? – berezovskyi

+0

Nein. Nach dem Problem wurde behoben, aber ich vermute, dass es etwas mit jdk-Versionen zu tun hat. –

+0

Ich wünschte, ich könnte dies hundert Mal verbessern – rrhartjr

1

ich in der gleichen Ausgabe lief. In meinem Fall verwendete das Projekt eine Bibliothek, die mit Java 1.5-Kompatibilität kompiliert wurde, während das Hauptprojekt mit Version 1.6 kompatibel war. Als ich beide auf 1.6 umstellte, ging das Problem weg. Ich hoffe, dass dies jemandem helfen kann, da das Problem ziemlich frustrierend und schwer zu verfolgen ist.

2

Ich habe den gleichen Fehler festgestellt, als ich versuchte, JAXB auf eine neuere Version zu aktualisieren als mit dem JDK. Java hat während der Laufzeit zwei oder mehr Instanzen von JAXB gefunden und konnte nicht entscheiden, welche Version verwendet werden soll.

In meinem Fall war das Problem, dass meine Anwendung Webdienste verwendet und ich JAX-WS nicht externalisiert hatte. Die Anwendung begann mit com.sun.xml.bind.v2.runtime-Klassen, aber als sie mit einer WSDL-Datei zu arbeiten begann, versuchte das interne JAX-WS, com.sun.xml aufzurufen. intern .bind.v2.runtime-Klassen. Der Fehler ist verschwunden, als ich JAX-WS heruntergeladen und installiert habe, und ich konnte das Upgrade fortsetzen.

-3

Wenn Sie jaxbiimpl jar während der Laufzeit über Ihren Abhängigkeitsmanager im Eltern-Pom einbinden, wird dieses Problem behoben. Diese Lösung ist spezifisch für Maven-Projekte.

+0

Könnte jemand mitteilen, warum diese Antwort abgelehnt wurde? Nicht dass ich weiß, verstehe oder glaube, dass es richtig ist, nur dass ich nicht auf seinem Gesicht sehe, warum es falsch ist. – MaasSql

1

Die akzeptierte Lösung funktionierte für mich in Intellij, aber ich habe den gleichen Fehler beim Ausführen von Maven von der Befehlszeile. Addiert man diese auf die Konfiguration für maven-surefire-plugin ausgewertete da noch die Frage, wie gut:

 <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> 
+0

Das funktioniert für mich, wenn ich maven von der Kommandozeile aus starte, aber nicht in Jenkins. Irgendeine Idee, was das Problem sein könnte? – user1766169

+0

Sorry, ich weiß es nicht. – L42

+1

Entschuldigung. Mein Fehler. Es funktioniert gut. – user1766169

1

entfernte ich die Abhängigkeit von separatem jaxb-impl Glas aus dem build.sbt. Das funktioniert jetzt.