java - Log4J 影响 JAXB

标签 java jaxb log4j dependencies weblogic

我正在将 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/

相关文章:

java - Ebean ORM在SQLite中自动创建表结构

java - 从 servlet 内部调用 java 方法

java - 为什么我在 Java 中收到 javafx.fxml.LoadException

jaxb - MOXy @XmlPath 被忽略

java - log4j 属性文件

Java 日志覆盖工具

java - 快速而肮脏的 Java wiki

java - jaxb xjc -wsdl 命令未知位置

java - 指定备用 JAXB 提供程序

hibernate - Log4j + hibernate 5 + Weblogic 12.2.1