我们使用 Java 8、Apache CXF 作为 Spring Boot 之上的 SOAP 客户端来向 WS 发送 SOAP 消息。
如果该应用程序作为 WAR 部署在 Tomcat 8 上,则该应用程序运行良好,并且 SOAP 客户端将使用正确的命名空间发送正确的 XML 消息。
如果在 Weblogic 12c 上部署相同的应用程序 WAR,则 CXF SOAP 客户端生成的 SOAP 消息缺少命名空间。
我们知道 WebLogic 可能使用了一些旧的 JAXB jar,这些 JAXB jar 负责从 Java 对象创建 XML 消息,它们与 Tomcat 服务器不同,这可能是我们看到此问题的原因。
我们也知道我们可以在 war 文件的 weblogic.xml 中指定 Weblogic 需要从 war 加载哪些 jars 以及直接从 Weblogic 库加载哪些依赖项,但是我们在 weblogic.xml 中尝试的每个组合都可以不行。
任何好的建议将不胜感激
带有 Apache CXF 的 Tomcat 服务器的 XML 输出示例
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
<event xmlns="http://www.test.com" xmlns:ns5="http://www.test2.com" xmlns:ns3="urn:test1:1423.15465:123123:namespace">
<ns5:created-date-time>2020-08-12T08:02:35Z</ns5:created-date-time>
<ns5:payload>
<Test2>
<ns3:ID>f14bb</ns3:ID>
<ns3:createdDateTime>2020-08-12T08:02:35Z</ns3:createdDateTime>
</Test2>
</ns5:payload>
</event>
</env:Body>
来自 Weblogic 12c 的示例代码
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
<event xmlns="http://www.test.com" xmlns:ns5="http://www.test2.com">
<ns5:created-date-time>2020-08-12T08:02:35Z</ns5:created-date-time>
<ns5:payload>
<Test2>
<ID>f14bb</ID>
<createdDateTime>2020-08-12T08:02:35Z</createdDateTime>
</Test2>
</ns5:payload>
</event>
</env:Body>
“urn:test1:1423.15465:123123:namespace”在 weblogic 服务器中被完全忽略,使得这个 XML 消息对消费者无效
weblogic.xml
我们试图告诉 weblogic 从 war 文件加载我们的类,而不是从 web 逻辑加载 JaxB 类,但没有成功
<wls:container-descriptor>
<wls:prefer-application-packages>
<wls:package-name>java.xml.bind.*</wls:package-name>
<wls:package-name>org.apache.cxf.*</wls:package-name>
<wls:package-name>javax.xml.ws.*</wls:package-name>
<wls:package-name>javax.wsdl.*</wls:package-name>
</wls:prefer-application-resources>
</wls:container-descriptor>
除了这个问题,其他一切正常,Apache CXF 在多种情况下都可以正确发送,其中之一是没有添加我们需要的命名空间
最佳答案
看起来您在这里描述了类加载问题。因此,请在您的 weblogic.xml 描述符中使用以下标记。
<prefer-web-inf-classes>false</prefer-web-inf-classes>
几年前,我一直在努力解决类加载问题,因为我错过了它。下面你有一个从这个 blog 中提取的例子。 .如果应用此方法后您仍然面临类加载器的问题,则应安装类加载器分析工具 (CAT) 以获取正在加载冲突类的类加载器。在此 blog您将获得一些有关如何使用的说明 猫 .
重要的是,在这个 document Oracle 声明了这一点
Note that in order to use prefer-application-packages or prefer-application-resources, prefer-web-inf-classes must be set to false.
关于spring-boot - WebLogic 12c 上的 Apache CXF SOAP JAXB 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63379865/