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 添加原始命名空间
我们正在使用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 添加原始命名空间