问题描述
我们正在使用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中提取的有关此内容的示例。
如果在应用此方法后仍然遇到类加载器问题,则应安装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以添加原始名称空间