Blog

JAX-WS, CXF und SAAJ auf Oracle Weblogic 10.3

Ravan Naidoo

Aktualisiert Oktober 23, 2025
3 Minuten

Vor kurzem musste ich JAX-WS-basierte Webservices unter Weblogic 10.3 zum Laufen bringen. Anstelle des standardmäßigen Weblogic 10.3 Stacks(Metro) musste jedoch der Apache CXF Stack verwendet werden. Und warum? Wir benötigten SOAP-over-JMS-Funktionen und das ist mit CXF ohne großen Aufwand möglich.

Laut der CXF-Benutzerdokumentation sollte eine Änderung der weblogic-application.xml und das Verpacken der CXF-Jars in der EAR für die Bereitstellung unter Weblogic ausreichen.



  javax.jws.*

Und wenn Sie mit Maven bauen, würden in der pom.xml die folgenden Abhängigkeiten definiert sein:



  org.springframework
  Frühling
  2.5.6

  org.apache.cxf
  cxf-rt-core
  ${cxf.version}

  org.springframework
  Federkern

  com.sun.xml.bind
  jaxb-impl

  org.codehaus.woodstox
  wstx-asl

  org.apache.geronimo.specs
  geronimo-javamail_1.4_spec

  org.apache.geronimo.specs
  geronimo-anmerkung_1.0_spec

  org.apache.geronimo.specs
  geronimo-aktivierung_1.1_spec

  org.apache.cxf
  cxf-rt-frontend-jaxws
  ${cxf.version}

  javax.xml.soap
  saaj-api

  com.sun.xml.messaging.saaj
  saaj-impl

  com.sun.xml.bind
  jaxb-impl

  org.codehaus.woodstox
  wstx-asl

  org.apache.geronimo.specs
  geronimo-javamail_1.4_spec

  org.apache.geronimo.specs
  geronimo-aktivierung_1.1_spec

  org.apache.cxf
  cxf-rt-transports-http
  ${cxf.version}

  org.springframework
  spring-web

  org.apache.cxf
  cxf-rt-transporte-jms
  ${cxf.version}

  org.springframework
  spring-jms

  org.apache.geronimo.specs
  geronimo-jms_1.1_spec

  org.apache.cxf
  cxf-rt-management
  ${cxf.version}

  org.springframework
  Federkern

  org.apache.cxf
  cxf-common-utilities
  ${cxf.version}

  org.springframework
  Federkern

  org.springframework
  Frühlingsbohnen

  org.springframework
  spring-kontext

  org.apache.geronimo.specs
  geronimo-stax-api_1.0_spec

  org.apache.geronimo.specs
  geronimo-anmerkung_1.0_spec

Diese Einrichtung war jedoch für die einfachsten Webservices ausreichend. Unsere Dienste verwendeten viele weitere JAX-WS-Annotationen zur Steuerung von Parameternamen, Namespaces, Operationsnamen, Soapbindings, WS-Addressing usw. Außerdem verwendeten wir das JAX-WS Handler-Framework für die benutzerdefinierte Verarbeitung von Soap-Headern. Diese Art von Webservices führte zu einem Szenario, in dem in CXF definierte JAX-WS Soap-Handler eine eingehende Soap-Nachricht verarbeiten mussten, deren erstes Element im Soap-Body ein Namespace-Präfix enthielt.


         
  Welt

Bei der Bereitstellung dieser Dienste unter Weblogic hatten wir schließlich mit SAAJ-Problemen (SOAP with Attachments API for Java) zu kämpfen, die durch die Kombination von JAX-WS Soap-Handlern, CXF und einem Element mit vorangestelltem Namespace im Soap-Body verursacht wurden. Der erste Fehler, der auftrat, war : java.lang.UnsupportedOperationException: This class does not support SAAJ 1.1 at weblogic.webservice.core.soap.SOAPPartImpl.createElementNS(SOAPPartImpl.java:820) at org.apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamWriter.java:132) at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:118) Es stellt sich heraus, dass die Standard-SAAJ-Implementierung von Weblogic im Paket weblogic.webservice.core.soap fehlerhaft ist. Es gibt jedoch eine zweite "gute" Implementierung, die sich im Paket weblogic.xml.saaj befindet und SAAJ 1.3 unterstützt. Um die SAAJ 1.3-Implementierung zu aktivieren, muss die Systemeigenschaft -Djavax.xml.soap.MessageFactory=weblogic.xml.saaj.MessageFactoryImpl musste dem Weblogic-Startskript hinzugefügt werden. Das nächste Problem, das auftrat, zeigte, dass die "gute" Implementierung gar nicht so gut war. java.lang.AssertionError: UNIMPLEMENTED at weblogic.xml.domimpl.NodeImpl.setPrefix(NodeImpl.java:173) at org.apache.cxf.staxutils.StaxUtils.startElement(StaxUtils.java:724) at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:791) at org.apache.cxf.binding.soap.saaj.SAAJInInterceptor.handleMessage(SAAJInInterceptor.java:168) at org.apache.cxf.jaxws.handler.soap.SOAPMessageContextImpl.getMessage(SOAPMessageContextImpl.java:78) at org.apache.cxf.jaxws.handler.soap.SOAPHandlerInterceptor.getOpQName(SOAPHandlerInterceptor.java:294) at org.apache.cxf.jaxws.handler.AbstractJAXWSHandlerInterceptor. setupBindingOperationInfo(AbstractJAXWSHandlerInterceptor.java:111) at org.apache.cxf.jaxws.handler.soap.SOAPHandlerInterceptor. createProtocolMessageContext(SOAPHandlerInterceptor.java:235) Als Ausweichlösung mussten wir auf die standardmäßige SAAJ-Implementierung zurückgreifen, die in der JSE6-Laufzeitumgebung vorhanden ist, anstatt eine der Weblogic-Implementierungen zu verwenden. Die JSE6-Implementierung kann durch Setzen der folgenden Systemeigenschaft im Weblogic-Startskript aktiviert werden: -Djavax.xml.soap.MessageFactory=com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl Dies funktioniert sowohl auf der SUN als auch auf der JRockit JVM. JAX-WS-Webservices, die auf dem CXF-Stack und dem Standard-Weblogic-Stack laufen, können jetzt in derselben Weblogic-Domäne eingesetzt werden, ohne sich gegenseitig zu behindern. Bisher scheint die Umgehung gut zu funktionieren. Ich werde Sie auf dem Laufenden halten, falls weitere Probleme auftreten sollten.

Verfasst von

Ravan Naidoo

Contact

Let’s discuss how we can support your journey.