2013-03-22 26 views
17

Pobrałem wiadomości Soap z usługi SOAP i próbowałem sfałszować usługę Soap, zwracając pobrane wiadomości. następujący kod pokazuje jak ja Unmarshalling komunikatu SOAP do wymaganej reakcjiNetbeans z JAXB Random ClassCastException .. cann można przesyłać do 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(); 
} 

Jednak wciąż otrzymuję ten ClassCastExeption co zdarza się przypadkowo. Po wielu testowych iteracjach zaczyna się to dziać. Czasami czyszczenie i kompilacja naprawia go, ale czasami nie działa.

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) 

Próbowałem inne sugestie online, takich jak powrót do starych wersjach JAXB i stosując zatwierdzone foldery w konfiguracji Maven kompilatora, ale nadal zdarza

jakieś pomysły na to, co może być przyczyną to i możliwe rozwiązania?

Thank u

+1

@TheDownVoter, jeśli chcesz pominąć pytania dotyczące głosów głosujących, podaj przynajmniej przyczynę lub coś podpowiedz! Pamiętaj, że nie wszyscy jesteśmy tak inteligentni, jak ci się wydaje. –

Odpowiedz

23

rozwiązany z następującym kodem

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

Parametr może być także ustawiony na JVM używając

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

Wow! Bardzo mi pomogłeś z tym rozwiązaniem! Czy sprawdziłeś, dlaczego ta optymalizacja przysporzyła tyle kłopotów? – berezovskyi

+0

Nie. Przeniesiono po rozwiązaniu problemu, ale podejrzewam, że ma coś wspólnego z wersjami jdk. –

+0

Chciałbym móc to zrobić sto razy – rrhartjr

1

wpadłem na tej samej kwestii w jednej z moich aplikacji. W moim przypadku projekt wykorzystywał bibliotekę skompilowaną z obsługą Java 1.5, a główny projekt miał kompatybilność z wersją 1.6. Kiedy zmieniłem oba na 1.6, problem zniknął. Mam nadzieję, że będzie w stanie pomóc komuś, ponieważ problem może być dość frustrujący i trudny do wyśledzenia.

2

Napotkano ten sam błąd, gdy próbowałem zaktualizować JAXB do nowszej wersji niż dostarczona z JDK. Java napotkała dwie lub więcej instancji JAXB w środowisku wykonawczym i nie mogła zdecydować, której wersji użyć.

W moim przypadku problem polegał na tym, że moja aplikacja korzystała z usług sieciowych, a ja również nie zamawiałem JAX-WS. Aplikacja zaczęła się od użycia klas com.sun.xml.bind.v2.runtime, ale kiedy zaczęła pracować z plikiem WSDL, wewnętrzny JAX-WS próbował wywołać com.sun.xml. wewnętrzne .bind.v2.rung klasy. Błąd zniknął, gdy pobrałem i zainstalowałem JAX-WS, i mogłem kontynuować aktualizację.

-3

Włączenie jaxbiimpl jar podczas uruchamiania przez menedżera zależności w nadrzędnym pom rozwiązuje ten problem. To rozwiązanie jest specyficzne dla projektów maven.

+0

Czy ktoś może podzielić się tym, dlaczego ta odpowiedź została odrzucona? Nie, żebym wiedział, zrozumiał lub uwierzył, że to jest poprawne, tyle tylko, że nie widzę na jego twarzy, dlaczego jest to nieprawidłowe. – MaasSql

1

Przyjęte rozwiązanie działało dla mnie w Intellij, ale ten sam błąd wystąpił podczas uruchamiania programu maven z wiersza poleceń. Dodanie tego do konfiguracji dla maven-surefire-plugin rozwiązał problem istnieje także:

 <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

To działa dla mnie podczas uruchamiania maven z linii poleceń, ale nie w Jenkins. Masz pojęcie, jaki może być problem? – user1766169

+0

Przepraszam, nie wiem. – L42

+1

Przepraszamy. Mój błąd. To działa dobrze. – user1766169

1

usunąłem zależność osobnym słoiku JAXB-IMPL z build.sbt. To działa teraz.