WebLogic 12c上的Apache CXF SOAP JAXB问题

问题描述

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

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

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

我们知道WebLogic可能会使用一些旧的JAXB jar来从Java对象创建XML消息,并且它们与Tomcat服务器不同,这也许就是我们看到此问题的原因。

我们还知道,我们可以在warfile的weblogic.xml中指定Weblogic需要从战争中加载的jar以及直接从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>

:信封>

在Weblogic服务器中,“ urn:test1:1423.15465:123123:namespace”被完全忽略,从而使该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>
,

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

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

几年前,我因为缺少类加载问题而苦苦挣扎。下面是从blog中提取的有关此内容的示例。

enter image description here

如果在应用此方法后仍然遇到类加载器问题,则应安装Classloader Analysis Tool(CAT)来获取类加载器,该类加载器正在加载冲突的类。在此blog中,您将获得有关如何使用 CAT 的说明。

重要的是,在此document中Oracle对此进行了陈述

请注意,为了使用 prefer-application-packages prefer-application-resources ,必须将 prefer-web-inf-classs设置为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以添加原始名称空间