Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Netbeans with JAXB Random ClassCastException ..cannot be cast to com.sun.xml.bind.v2.runtime.reflect.Accessor

I have downloaded the Soap messages from a SOAP Service and trying to mock the Soap service by returning the downloaded messages. the following code shows how I am Unmarshalling the Soap message into the required Response

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

However I keep getting this ClassCastExeption which happens randomly. After a number of test iterations, it begins to happen. Sometimes a clean and build fixes it but sometimes it doesn't work.

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)

I have tried other online suggestions such as reverting to old jaxb versions and using endorsed folders in the maven compiler configuration but it still happens

Any ideas on what could be causing it and possible solutions?

Thank u

like image 640
Farouk Alhassan Avatar asked Mar 22 '13 11:03

Farouk Alhassan


2 Answers

Solved with the following code

@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 can also be set at JVM using

-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true 
like image 117
Farouk Alhassan Avatar answered Sep 24 '22 00:09

Farouk Alhassan


I encountered the same error when I tried to upgrade JAXB to a newer version than what came with the JDK. Java encountered two or more instances of JAXB at runtime and could not decide which version to use.

In my case, the problem was that my application used web services, and I hadn't externalized JAX-WS as well. The application started out using com.sun.xml.bind.v2.runtime classes, but when it began working with a WSDL file, the internal JAX-WS tried to invoke com.sun.xml.internal.bind.v2.runtime classes. The error went away when I downloaded and installed JAX-WS, and I was able to continue the upgrade.

like image 35
Ritzbot Avatar answered Sep 23 '22 00:09

Ritzbot