java - Conflicto de controlador Oracle JDBC
jboss classcastexception (2)
Servidor independiente JBoss EAP 6.1
La aplicación desplegada como un archivo war arroja una excepción de tiempo de ejecución
java.lang.ClassCastException: oracle.sql.ARRAY cannot be cast to oracle.sql.ARRAY
en línea
oracle.sql.ARRAY obj = (oracle.sql.ARRAY) rs.getObject("RATINGOBJ");
JDBC libary incluido es ojdbc6.jar (WEB_INF / lib). Todas las bibliotecas están incluidas en el archivo war y no hay ninguna configuración de libaries "global" en el servidor. He verificado que no se incluyen otras bibliotecas jdbc en ninguna parte de la aplicación.
Para crear un origen de datos JDBC, creé una implementación para ojdbc6.jar. Esta es la única fuente posible de conflicto en la que puedo pensar. Cuando elimino el archivo ojdbc6.jar del archivo war, obtengo una excepción ClassNotFound en lugar de ClassCastException.
Cualquier otra parte de la aplicación funciona bien, excepto esta línea. ¿Cómo puedo depurar esto más?
No debe tener ningún JAR de controlador JDBC en el nivel WEB-INF / lib. Los servidores de aplicaciones Java EE necesitan que estén en el nivel del servidor de aplicaciones.
Moverlo al directorio de servidor / lib predeterminado y ver si eso es mejor.
No estoy seguro de por qué no funcionará la carga desde web-inf / lib. Lo más probable es que el cargador de clases sea diferente.
Haz los primeros dos pasos para el diagnóstico. Luego, prueba una de las dos alternativas a continuación para solucionar el problema.
1) Compruebe si los cargadores de clase son los mismos comparando rs.getObject().getClass(''RATINGOBJ'').getClassLoader()
y oracle.sql.ARRAY.class.getClassLoader()
Si hace equals
entre los dos cargadores de clase, debería devolver falso ya que parece que los cargadores de clase son diferentes. Verifique una explicación en ClassCastException al convertir a la misma clase
Este problema ya se informó anteriormente en otro foro en https://forums.oracle.com/message/9330314 . Mover los jars en jboss aún dará como resultado los mismos problemas.
2) Averigüe los frascos de origen de donde se cargan las clases y elimine el frasco que no necesita. Encuentra los frascos para las dos clases diferentes revisando
rs.getObject().getClass(''RATINGOBJ'').getProtectionDomain().getCodeSource().getLocation()
oracle.sql.ARRAY.class.getProtectionDomain().getCodeSource().getLocation()
- Determina qué archivo JAR es una clase es desde
Soluciones posibles:
a) Si necesita los dos frascos, tendrá que mover el Frasco de rs.getObject().getClass(''RATINGOBJ'').getProtectionDomain().getCodeSource().getLocation()
y cree el módulo como se especifica en http://www.javaworld.com/community/node/8184 .
b) Si todavía no puede cargar las clases como espera, especifique la biblioteca en la biblioteca del servidor jboss.
c) La última solución para forzar que las clases se carguen desde un jar particular es especificando el jar en el bootclasspath.