Spring Boot WebLogic 12c上的Apache CXF SOAP JAXB问题

44u64gxh  于 2023-03-29  发布在  Spring
关注(0)|答案(4)|浏览(142)

我们正在使用Java 8,Apache CXF作为Sping Boot 之上的SOAP客户端向WS发送SOAP消息。
如果将应用程序作为WAR部署在Tomcat 8上,则应用程序工作正常,SOAP客户机将使用正确的名称空间发送正确的XML消息。
如果在Weblogic12c上部署了相同的应用程序WAR,则由CXFSOAP客户机生成的SOAP消息缺少名称空间。
我们知道WebLogic可能使用一些旧的JAXB jar来负责从Java对象创建XML消息,它们与Tomcat服务器不同,这可能是我们看到这个问题的原因。
我们还知道,我们可以在war文件的weblogic.xml中指定Weblogic需要从war加载哪些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>

</env:Envelope>

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>

</env:Envelope>
“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在多个场景中发送正确,只有一个是它没有添加我们需要的命名空间

ar7v8xwq

ar7v8xwq1#

看起来你在这里描述的是一个类加载问题。因此,请在你的weblogic.xml描述符中使用下面的标记。

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

几年前,我一直在努力解决类加载问题,因为我错过了它。下面你有一个例子,从这个blog中提取出来。

如果在应用此方法后,您仍然面临类加载器的问题,您应该安装Classloader Analysis Tool(CAT)以获取类加载器,它正在加载冲突的类。在此blog中,您将获得有关如何使用CAT的一些说明。
重要的是,在本文档中,Oracle说明了这一点
请注意,要使用prefer-application-packagesprefer-application-resourcesprefer-web-inf-classes必须设置为false

6ovsh4lw

6ovsh4lw2#

此问题已通过更新www.example.com解决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添加原始名称空间

r7knjye2

r7knjye23#

请检查上面提到的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>
qkf9rpyu

qkf9rpyu4#

我的发现是,名称空间的行为是否正确取决于mashaller使用的是哪个jaxb上下文(默认情况下是com.sun.xml.bind.jaxb-impl.jar或eclipselink.jar),从应用程序到com.sun.xml端的覆盖WebLogic首选包的数量并没有达到预期的效果,只有当使用eclipselink.jar marshaller正确地产生名称空间时,如果调试的话,这是需要注意的地方,

BareOutInterceptor->AbstractOutDatabindingInterceptor->DataWriterImpl->JAXBEncoderDecoder
            writeObject(marshaller, source, newJAXBElement(elName, cls, elValue))
// marshaller.getClass().getProtectionDomain().getCodeSource() useful methods

要将jaxb上下文设置为所需的上下文,Oracle建议系统属性将上下文设置为https://docs.oracle.com/cd/E24329_01/web.1211/e24964/data_types.htm#WSGET348,这并不好,因为它会影响所有内容,然后可能会破坏其他功能
更巧妙的覆盖(在这里找到http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)是创建一个jaxb.properties文件,并将其放置在WEB-INF/classes中,与生成的类的包名相同的文件夹结构中

相关问题