我正在将 SOAP WS 应用程序从 WL10 迁移到 WL12。我们遇到了 JAXB 如何解释此 XML 元素的问题:
<sch:testVar xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
在 WL10 中,JAXB 正确地将其编码为空对象。在 WL12 中,JAXB 将其转换为空字符串。
在对类路径和数据绑定(bind)提供程序进行了大量研究之后,我们终于找到了问题所在……Log4J。
我们正在使用 Maven 并添加依赖项 Log4J 1.2.16 改变了一切。当 Log4J 在应用程序中时,上面的 XML 呈现为空字符串。仅从 pom 中删除 Log4J 依赖项,JAXB 将上面的 XML 呈现为 null。
有谁知道为什么 Log4J 会影响 JAXB?
一些注意事项:
- 我们知道 WL12 如何改变 JAXB 实现。我们花了几天时间更改类路径和依赖项。
- 我们正在使用一个非常精简的应用程序。我们的其他依赖项包括 Spring (core, context-support, web, tx, ws-core) 3.1.1。就是这样。
- 除了输出对象是什么,我们的测试端点不做任何事情。
- Log4J2 工作正常。
- 我们的 Log4J 1.2.16 依赖项没有引入其他依赖项
maven 构建的依赖树如下:
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ RJM-Training-SOAP-WS ---
[INFO] com.mycompany:RJM-Training-SOAP-WS:war:0.0.1-SNAPSHOT
[INFO] +- org.springframework:spring-core:jar:3.1.1.RELEASE:compile
[INFO] | +- org.springframework:spring-asm:jar:3.1.1.RELEASE:compile
[INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] +- org.springframework:spring-context-support:jar:3.1.1.RELEASE:compile
[INFO] | +- org.springframework:spring-beans:jar:3.1.1.RELEASE:compile
[INFO] | \- org.springframework:spring-context:jar:3.1.1.RELEASE:compile
[INFO] | \- org.springframework:spring-expression:jar:3.1.1.RELEASE:compile
[INFO] +- org.springframework:spring-web:jar:3.1.1.RELEASE:compile
[INFO] | \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework:spring-tx:jar:3.1.1.RELEASE:compile
[INFO] | \- org.springframework:spring-aop:jar:3.1.1.RELEASE:compile
[INFO] +- org.springframework.ws:spring-ws-core:jar:2.1.2.RELEASE:compile
[INFO] | +- org.springframework.ws:spring-xml:jar:2.1.2.RELEASE:compile
[INFO] | +- org.springframework:spring-oxm:jar:3.1.3.RELEASE:compile
[INFO] | | \- commons-lang:commons-lang:jar:2.5:compile
[INFO] | +- org.springframework:spring-webmvc:jar:3.1.3.RELEASE:compile
[INFO] | \- wsdl4j:wsdl4j:jar:1.6.1:compile
[INFO] \- log4j:log4j:jar:1.2.16:compile
我们使用的 JAXB 上下文如下:
[user@server logs]$ grep JAXBContext WSServer01.log.out
[Loaded javax.xml.bind.JAXBContext from /opt/weblogic/wl12.1.2.0/wlserver/../oracle_common/modules/endorsed/javax-xml-bind.jar]
[Loaded com.sun.xml.bind.v2.runtime.JAXBContextImpl from file:/opt/weblogic/wl12.1.2.0/oracle_common/modules/com.sun.xml.bind.jaxb-impl_2.2.jar]
[Loaded com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder from file:/opt/weblogic/wl12.1.2.0/oracle_common/modules/com.sun.xml.bind.jaxb-impl_2.2.jar]
[Loaded com.sun.xml.bind.v2.runtime.JAXBContextImpl$5 from file:/opt/weblogic/wl12.1.2.0/oracle_common/modules/com.sun.xml.bind.jaxb-impl_2.2.jar]
[Loaded com.sun.xml.bind.v2.runtime.JAXBContextImpl$6 from file:/opt/weblogic/wl12.1.2.0/oracle_common/modules/com.sun.xml.bind.jaxb-impl_2.2.jar]
[Loaded com.sun.xml.bind.v2.runtime.JAXBContextImpl$3 from file:/opt/weblogic/wl12.1.2.0/oracle_common/modules/com.sun.xml.bind.jaxb-impl_2.2.jar]
[Loaded com.sun.xml.bind.v2.runtime.JAXBContextImpl$7 from file:/opt/weblogic/wl12.1.2.0/oracle_common/modules/com.sun.xml.bind.jaxb-impl_2.2.jar]
[Loaded com.sun.xml.bind.v2.runtime.JAXBContextImpl$1 from file:/opt/weblogic/wl12.1.2.0/oracle_common/modules/com.sun.xml.bind.jaxb-impl_2.2.jar]
[Loaded com.sun.xml.bind.v2.runtime.JAXBContextImpl$2 from file:/opt/weblogic/wl12.1.2.0/oracle_common/modules/com.sun.xml.bind.jaxb-impl_2.2.jar]
我进入代码并记录了使用的 JAXB 类。在这两种情况下都是一样的。
file:/opt/weblogic/wl12.1.2.0/oracle_common/modules/endorsed/javax-xml-bind.jar!/javax/xml/bind/JAXBContext.class
最佳答案
有人在内部找出了问题的根本原因。解决方案是更改 Spring WS 使用的 messageFactory 实现。我将这个 bean 定义添加到我的项目中:
<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
<property name="messageFactory">
<bean class="com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"/>
</property>
</bean>
加载 Log4J 1.x 时,它正在加载较新版本的 SAAJ API,这导致了我们的 nillable 问题。 Log4J 2.x 之所以有效,是因为它默认使用较旧的 SAAJ 实现。
如果我们指定上面列出的 messageFactory,我们就可以使用 Log4J 1.x。
关于java - Log4J 影响 JAXB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31701031/