问题
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
回答1:
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
回答2:
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.
回答3:
I ran into the same issue in one of my applications. In my case, the project was using a library compiled with Java 1.5 compatibility while the main project had compatibility with version 1.6. When I changed both to use 1.6 the problem went away. I hope this will be able to help someone since the problem can be quite frustrating and hard to track.
回答4:
The accepted solution worked for me when in Intellij, but I got the same error when running maven from the command line. Adding this to the configuration for maven-surefire-plugin
solved the issue there as well:
<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>
回答5:
I removed the dependency on separate jaxb-impl jar from the build.sbt. That works now.
回答6:
I had a similar issue, but I didn't / don't have a dependeny(-version-mismatch)-problem.
In my case, a class was missing a @XmlAccessorType, adding this annotation solved my problem. Adapted to your case, the solution would be:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD) // check, if @XmlAccessorType is missing
public class GetClientByAccountResponse {
..
回答7:
Including jaxbiimpl jar during run time through your dependency manager in parent pom will resolve this issue. This solution is specific to maven projects.
来源:https://stackoverflow.com/questions/15569395/netbeans-with-jaxb-random-classcastexception-cannot-be-cast-to-com-sun-xml-bin