2012-02-12 30 views
9

Estoy buscando una implementación alternativa de SOAP (javax.xml.soap), que no sea Sun SAAJ. El motivo es que me gustaría implementar JAX-WS WebService en IBM Tomcat AS con IBM JDK 5, pero es un problema conocido que la implementación de Sun SAAJ depende de las clases de Xerces reasignadas (ver Ref Impl does not work with IBM JDK y SAAJ test cases no longer work with IBM's SDK) y la única salida para eso es utilizar un perfil de Maven costumbre de tirar com.sun.xml.parsers:jaxp-ri como:Alternativa a Sun Implementación de SOAP SAAJ

<profiles> 
    <profile> 
     <id>pre-jdk5-profile</id> 

     <activation> 
      <jdk>(,1.4]</jdk> 
     </activation> 

     <dependencies> 
      <dependency> 
       <groupId>com.sun.xml.parsers</groupId> 
       <artifactId>jaxp-ri</artifactId> 
       <scope>runtime</scope> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 

me gustaría dejar este perfil y simplemente reemplazar la implementación SOAP con uno que funciona en todas partes.

supongo que las implementaciones proveedor jabón puede venir con Apache Axis/Apache CXF (que se basa en IBM SOAP4J) o JBoss AS - por favor proporcionar información basada en mis preferencias:

  • La implementación debe ser fácil de separar de la personal de descanso (preferiblemente un tarro de peso liviano).
  • La implementación debería ser compatible con SOAP messages with attachments.
  • La implementación debe ser compatible con bytecode Java5.
  • Si la implementación está disponible en Maven Central, esta es una ventaja.

Referencias:

Respuesta

6

Después de navegar, he encontrado la siguiente solución potencial del problema. He explorado cuáles son los descendientes de javax.xml.soap.MessageFactory usando grepcode.com.

Aparte de norma com.sun.xml.messaging.saaj.soap.MessageFactoryImpl, he encontrado (como se suponía):

  • org.apache.axis2.saaj.MessageFactoryImpl en org.apache.axis2:axis2-saaj:1.6.1. Este JAR anuncia correctamente las fábricas a través de META-INF\services\javax.xml.soap.MessageFactory y META-INF\services\javax.xml.soap.MetaFactory, por lo que no se necesita ninguna otra configuración. Esta versión (según Maven Central) fue lanzada en 2011, pocas dependencias, recomendadas.
  • org.jboss.ws.core.soap.MessageFactoryImpl en org.jboss.ws.native:jbossws-native-core:3.2.1.Beta2 de JBoss 3.x. Parece ser bastante antiguo y quizás JBoss ya no esté apoyando su desarrollo ya que pude encontrar este contenedor fuera de maven central (here). Muchas dependencias, tamaño 1.8M, no recomendado.
  • org.apache.openejb.server.webservices.saaj.MessageFactoryImpl en org.apache.openejb:openejb-webservices:4.0.0-beta-2 y org.apache.geronimo.webservices.saaj.GeronimoMessageFactory en org.apache.geronimo.modules:geronimo-webservices:3.0-M1. En realidad, cualquiera de estas fábricas es un wrapper/runtime_locator para las implementaciones Axis2 o Sun (véanse SaajFactoryFinder y SAAJFactoryFinder). No debe ser considerado.

Conclusión: la única alternativa aceptable es la implementación de Axis2.

+0

Eso podría funcionar. Si no tiene éxito con Axis2 podría considerar usar Spring WS, que debería funcionar en JDK desde 1.4 hasta. – TechTrip

+1

(desafortunadamente) de [spring-ws-parent-2.0.4.RELEASE.pom] (http://mirrors.ibiblio.org/pub/mirrors/maven2/org/springframework/ws/spring-ws-parent/2.0 .4.RELEASE/muelle-WS-padres-2.0.4.RELEASE.pom): ' com.sun.xml.messaging.saaj saaj-impl 1.3.2' que es una señal que quizás Spring-WS utiliza Sun SAAJ y de alguna manera solucionan el mismo problema. –

+0

Sí, mi mal, uggh. – TechTrip

0

Aunque no sé la respuesta a su pregunta exacta, tengo una solución de cómo se puede hacer Sun SAAJ (y JAX-WS RI) trabajan bajo JRE 1.5. La razón por la que hay problemas con la ejecución de JAX-WS RI en Java 5 es, de hecho, la obsoleta JAXP (Java 1.5 viene con JAXP 1.3, mientras que JAX-WS RI requiere JAXP 1.4) Y porque JAX-WS RI está codificado para usar el Sun JAXP RI (com.sun.org.apache ...). Como JAXP 1.3 es parte del JRE, no puede simplemente reemplazarlo (puede reemplazar la implementación, pero no la API). La solución es el puerto de xerces de activesoap, que es una versión reducida de JAXP 1.4 que utiliza la denominación de paquete Sun JAXP RI (com.sun.org.apache). Se puede encontrar en el repositorio de Maven:

<dependency> 
    <groupId>activesoap</groupId> 
    <artifactId>jaxb-xercesImpl</artifactId> 
    <version>1.5</version> 
</dependency> 

no les importa la denominación extraño paquete - a modo de prueba.

Esto es a menudo todo lo que se necesita para ejecutar el Sol JAX-WS RI (y SAAJ como parte de ella) en Java 5.

No se olvide de no incluir ninguna JAR API JAXP. Conflictarán con la API JAXP de Java 5.

+0

** rustyx **, gracias por su esfuerzo, pero su respuesta va en la dirección equivocada. El perfil que he mencionado hace exactamente lo que sugiere: si extrae la implementación de Sun Xerces y resuelve el problema en 1.5 –

+0

1) ¿por qué no incluir siempre el jar de jaxp? 2) ¿Estás seguro de que puedes cambiar SAAJ sin moverte a otra pila JAX-WS? – rustyx

+0

1) Tener varios Xerces en su classpath no es bueno y puede provocar problemas que son difíciles de rastrear, ya que en cierto momento no sé qué Xerces se usa. 2) No sé. Si eso no es posible, espero que la comunidad lo diga. Por otro lado, no veo ningún problema en 'javax.xml.soap' con otras implementaciones. ¿Por qué esto debería obligarme a cambiar a otra pila? –

0

Tough one. Quizás vea una de las versiones de Apache CXF. http://cxf.apache.org/

Es posible que desee probar voltear el cargador de clases, agrupando los frascos que necesita con su aplicación web y cargando en un modelo PARENT_LAST. Esta es probablemente su mejor apuesta.

Una tercera opción en Tomcat podría ser el Mecanismo de anulación de estándares endosados ​​compatible con Java y Tomcat.-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS

Ver aquí, creo que se aplica a las versiones anteriores de Tomcat: http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html#XML_Parsers_and_Java.

+1

Sé que la implementación de SAAJ debería estar en CXF, pero ¿cómo utilizarla? ¿Qué jarras usar? (bueno, no hay necesidad de ponerlos en 'endorsed' ya que utilizo IBM JDK, que no está empaquetado con SAAJ). –

+0

Han pasado unos años pero tuve que hacer algo similar en Websphere. volteé el cargador de clases al último padre y tuve que incluir algunas de las jarras centrales que estaban en conflicto con mi servicio web. No puedo recordar los frascos exactos que tuve que incluir. Empecé con el tiempo de ejecución de jaxp y tuve que volver corriendo en un proceso de eliminación. – TechTrip

+0

Creo que he encontrado la aprobación de mi teoría :) Verifique mi respuesta. –