2013-03-22 13 views
17

Ho scaricato i messaggi Soap da un servizio SOAP e sto provando a prendere in giro il servizio Soap restituendo il download messaggi. il codice seguente mostra come sto deserializzazione del messaggio SOAP nella risposta richiestaNetbeans con JAXB Random ClassCastException .. non può essere lanciato su 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(); 
} 

Tuttavia continuo a ricevere questo ClassCastExeption che avviene in modo casuale. Dopo un certo numero di iterazioni di prova, inizia a succedere. A volte un clean e build lo risolve ma a volte non funziona.

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) 

Ho provato altri suggerimenti online come un ritorno alle versioni vecchie JAXB e utilizzando le cartelle approvati nella configurazione di Maven compilatore, ma succede ancora

Tutte le idee su quello che potrebbe essere la causa e le possibili soluzioni?

Thank u

+1

@TheDownVoter se stai andando in giro a votare le domande dei popoli, almeno fornisci una motivazione o suggerisci qualcosa! Ricorda che non siamo tutti intelligenti come pensi di essere. –

risposta

23

risolto con il seguente codice

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

parametro può anche essere impostata alla JVM utilizzando

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

Wow! Mi hai aiutato molto con questa soluzione! Hai ispezionato il motivo per cui l'ottimizzazione ha causato così tanti problemi? – berezovskyi

+0

No. Si è spostato dopo che il problema è stato risolto ma ho il sospetto che abbia a che fare con le versioni di jdk. –

+0

Vorrei poterlo inviare un centinaio di volte in più. – rrhartjr

1

Ho incontrato lo stesso problema in una delle mie applicazioni. Nel mio caso, il progetto utilizzava una libreria compilata con la compatibilità con Java 1.5 mentre il progetto principale aveva compatibilità con la versione 1.6. Quando ho cambiato entrambi per usare 1.6 il problema è andato via. Spero che questo possa aiutare qualcuno dal momento che il problema può essere piuttosto frustrante e difficile da rintracciare.

2

Ho riscontrato lo stesso errore quando ho provato ad aggiornare JAXB a una versione più recente rispetto a quella fornita con JDK. Java ha rilevato due o più istanze di JAXB in fase di runtime e non è stato in grado di decidere quale versione utilizzare.

Nel mio caso, il problema era che la mia applicazione utilizzava i servizi Web, e non avevo nemmeno esternato JAX-WS. L'applicazione è iniziata utilizzando le classi com.sun.xml.bind.v2.runtime, ma quando ha iniziato a lavorare con un file WSDL, il JAX-WS interno ha provato a richiamare com.sun.xml. interno classi .bind.v2.runtime. L'errore è andato via quando ho scaricato e installato JAX-WS, e sono stato in grado di continuare l'aggiornamento.

-3

L'inclusione del barattolo jaxbiimpl durante il runtime tramite il gestore delle dipendenze in pom padre risolverà questo problema. Questa soluzione è specifica per i progetti di maven.

+0

Qualcuno potrebbe condividere perché questa risposta non è stata votata? Non che io sappia, capisco o creda che sia corretto, solo che non vedo in faccia perché non è corretto. – MaasSql

1

La soluzione accettata ha funzionato per me in Intellij, ma ho ricevuto lo stesso errore durante l'esecuzione di maven dalla riga di comando. Aggiungendo questo alla configurazione per maven-surefire-plugin risolto il problema lì:

 <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

Questo funziona per me quando si esegue Maven dalla riga di comando ma non in Jenkins. Qualche idea su quale potrebbe essere il problema? – user1766169

+0

Scusa, non lo so. – L42

+1

Siamo spiacenti. Errore mio. Funziona bene. – user1766169

1

ho rimosso la dipendenza sul barattolo jaxb-impl separato dal build.sbt. Funziona ora.

Problemi correlati