spring-boot - WebLogic 12c 上的 Apache CXF SOAP JAXB 问题

标签 spring-boot jaxb cxf weblogic12c

我们使用 Java 8、Apache CXF 作为 Spring Boot 之上的 SOAP 客户端来向 WS 发送 SOAP 消息。
如果该应用程序作为 WAR 部署在 Tomcat 8 上,则该应用程序运行良好,并且 SOAP 客户端将使用正确的命名空间发送正确的 XML 消息。
如果在 Weblogic 12c 上部署相同的应用程序 WAR,则 CXF SOAP 客户端生成的 SOAP 消息缺少命名空间。
我们知道 WebLogic 可能使用了一些旧的 JAXB jar,这些 JAXB jar 负责从 Java 对象创建 XML 消息,它们与 Tomcat 服务器不同,这可能是我们看到此问题的原因。
我们也知道我们可以在 war 文件的 weblogic.xml 中指定 Weblogic 需要从 war 加载哪些 jars 以及直接从 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 在多种情况下都可以正确发送,其中之一是没有添加我们需要的命名空间

最佳答案

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

<prefer-web-inf-classes>false</prefer-web-inf-classes>
几年前,我一直在努力解决类加载问题,因为我错过了它。下面你有一个从这个 blog 中提取的例子。 .
enter image description here
如果应用此方法后您仍然面临类加载器的问题,则应安装类加载器分析工具 (CAT) 以获取正在加载冲突类的类加载器。在此 blog您将获得一些有关如何使用的说明 .
重要的是,在这个 document Oracle 声明了这一点

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

关于spring-boot - WebLogic 12c 上的 Apache CXF SOAP JAXB 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63379865/

相关文章:

java - Spring 严格传输安全(HSTS)配置不起作用

java - 使用 Axis2 - AXIOM、JAXB、ADB 或 XMLBeans 构建 Web 服务对我来说什么是正确的选择

java - CXF: SOAP 头中的多个部分

web-services - 使用 CXF 生成的 Web 服务生成 Exception 异常类

java - Spring Security 两种角色实现

java - 使用 Spring MVC 中的属性文件更新默认区域设置值

java - Java Spring 在无效的 HttpSession 上返回错误

jaxb - 使用 JAXB 解码 SOAP 消息

java - 如何向 XML DOM 对象添加命名空间前缀?

java - 访问 CXF Rest 服务中的 post 方法时出现问题