java - simple - Netbeans con JAXB Random ClassCastException... no se puede convertir a com.sun.xml.bind.v2.runtime.reflect.Accessor
web service java netbeans examples (7)
Eliminé la dependencia de un jar jaxb-impl separado de build.sbt. Eso funciona ahora.
He descargado los mensajes de Soap de un servicio SOAP y trato de burlarme del servicio de Soap devolviendo los mensajes descargados. el siguiente código muestra cómo estoy Desmallando el mensaje de Jabón en la Respuesta requerida
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();
}
Sin embargo, sigo recibiendo esta ClassCastExeption que sucede al azar. Después de una serie de iteraciones de prueba, comienza a suceder. A veces, una limpieza y compilación lo corrige pero a veces no funciona.
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)
He intentado otras sugerencias en línea, como volver a las versiones antiguas de jaxb y usar carpetas aprobadas en la configuración del compilador de Maven, pero todavía sucede.
¿Alguna idea sobre qué podría estar causando y posibles soluciones?
Gracias
Encontré el mismo error cuando intenté actualizar JAXB a una versión más nueva que la que venía con el JDK. Java encontró dos o más instancias de JAXB en tiempo de ejecución y no pudo decidir qué versión utilizar.
En mi caso, el problema era que mi aplicación utilizaba servicios web, y tampoco había externalizado JAX-WS. La aplicación comenzó usando clases com.sun.xml.bind.v2.runtime, pero cuando comenzó a trabajar con un archivo WSDL, el JAX-WS interno intentó invocar com.sun.xml. Clases internas de .bind.v2.runtime. El error desapareció cuando descargué e instalé JAX-WS y pude continuar con la actualización.
La inclusión de jaxbiimpl jar durante el tiempo de ejecución a través de su administrador de dependencias en pom principal resolverá este problema. Esta solución es específica para proyectos de maven.
La solución aceptada funcionó para mí cuando estaba en Intellij, pero obtuve el mismo error al ejecutar maven desde la línea de comandos. Al agregar esto a la configuración de maven-surefire-plugin
resolvió el problema:
<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>
Me encontré con el mismo problema en una de mis aplicaciones. En mi caso, el proyecto estaba usando una biblioteca compilada con compatibilidad con Java 1.5, mientras que el proyecto principal tenía compatibilidad con la versión 1.6. Cuando cambié ambos para usar 1.6, el problema desapareció. Espero que esto pueda ayudar a alguien ya que el problema puede ser bastante frustrante y difícil de seguir.
Resuelto con el siguiente código
@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");
}
El parámetro también se puede configurar en JVM usando
-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true
Tuve un problema similar, pero no tuve / no tuve un problema de dependencia (-versión-desajuste).
En mi caso, a una clase le faltaba un @XmlAccessorType , agregar esta anotación solucionó mi problema. Adaptada a su caso, la solución sería:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD) // check, if @XmlAccessorType is missing
public class GetClientByAccountResponse {
..