WebLogic 12c 上的 Apache CXF SOAP JAXB 问题

Apache CXF SOAP JAXB issue on WebLogic 12c

我们正在使用Java 8、Apache CXF 作为SOAP 客户端在Spring Boot 之上向WS 发送SOAP 消息。

如果应用程序在 Tomcat 8 上作为 WAR 部署,应用程序运行良好并且 SOAP 客户端使用正确的命名空间发送正确的 XML 消息。

如果同一应用程序 WAR 部署在 Weblogic 12c 上,则 CXF SOAP 客户端生成的 SOAP 消息缺少命名空间。

我们知道 WebLogic 可能使用一些旧的 JAXB jar,它们负责从 Java 对象创建 XML 消息,它们与 Tomcat 服务器不同,这可能我们看到这个问题的原因。

我们也知道可以在war文件中的weblogic.xml指定Weblogic需要从war加载哪些jar,直接从war加载哪些依赖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 在多种情况下发送正确,只有一种情况是它没有添加我们需要的命名空间

请检查提到的 page,它具有不同的过滤类加载:

   <wls:prefer-application-packages>
        <wls:package-name>com.ctc.wstx.*</wls:package-name>
        <wls:package-name>javax.wsdl.*</wls:package-name>
        <wls:package-name>org.apache.cxf.*</wls:package-name>
        <!-- <wls:package-name>javax.jws.*</wls:package-name> -->
    </wls:prefer-application-packages>

您在这里描述的似乎是 class 加载问题。因此,请在您的 weblogic.xml 描述符中使用以下标签。

<prefer-web-inf-classes>false</prefer-web-inf-classes>

几年前,我一直在努力解决 class 加载问题,因为我错过了它。下面你有一个从这个 blog.

中提取的例子

如果在应用此后您仍然面临 class 加载器的问题,您应该安装类加载器分析工具 (CAT) 以获取 class 加载器,它正在加载冲突的 class是的。在此 blog 中,您将获得一些有关如何使用 CAT.

的说明

重要的是,在此 document Oracle 中声明了这一点

Note that in order to use prefer-application-packages or prefer-application-resources, prefer-web-inf-classes must be set to false.

此问题已通过更新 package-info.java

解决
@javax.xml.bind.annotation.XmlSchema(namespace = "urn:test1",
    xmlns = {@XmlNs(prefix = "",
         namespaceURI = "http://www.test.com")},
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

这是 package-info 之前没有的部分

xmlns = {@XmlNs(prefix = "", namespaceURI = "http://www.test.com")}

添加命名空间技巧 JavaXB 添加原始命名空间