RSSCategory: Others

Axis 1.4 y Java 1.6

Axis 1.4 y Java 1.6

| March 24, 2011 | 0 Comments

Esta es la excepción que se obtiene:


java.lang.ClassCastException: com.sun.xml.internal.messaging.saaj.soap.ver1_1.Envelope1_1Impl 


Nos encontramos sobre el siguiente entorno:

Tenemos una aplicación que actúa como cliente de un servicio web empleando Axis 1.4, estando el servidor de aplicaciones (Apache Tomcat 5) ejecutándose sobre una máquina virtual JDK 1.6

Al llegar al envío de la petición y una vez esta esta bien construida:

resp = (String) call.invoke(new Object[] {XMLUtils.DocumentToString(request)});

Se produce la excepción antes mencionada:

java.lang.ClassCastException: com.sun.xml.internal.messaging.saaj.soap.ver1_1.Envelope1_1Impl 

El origen del error proviene de una incompatibilidad entre la implementación de la librería saaj propia de axis y la contenida en el runtime de la JDK 1.6, es decir tenemos dos librerías que tienen implementaciones de saaj distintas:

  • rt.jar. Es la librería del runtime de Java. La implementación de saaj contenida en ella es incompatible con axis.
  • axis-saaj.jar Esta es la implementación saaj de axis.


Cuando se ejecuta la petición del servicio web, el servidor de aplicaciones busca una implementación de saaj: primero busca en el runtime y después en el servidor de aplicaciones.

Solución: invertir el orden de búsqueda de la librería axis de la implementación de saaj. Para lo cual podemos tener varias soluciones en el caso en el que usemos Apache Tomcat:

– Quitar o sustituir la librería rt.jar: esta es altamemente no recomendable puesto que es una librería básica de la jdk.
– Usar la versión jdk 1.4 en lugar de la 1.6 como entorno de ejecución del Apache Tomcat.
– También se puede usar el classpath para obligar a que la librería axis-saaj.jar sea la primera en cargarse. 

SOLUCIÓN RECOMENDABLE: ubicar la librería axis-saaj.jar en la carpeta endorsed del Tomcat, que es la carpeta que primero mira Tomcat para buscar la implementación de clases, incluso antes que el runtime.