WebSphere的JAXB MarshallerProxy是否使用参考实现?

时间:2018-02-09 06:32:38

标签: jaxb websphere ibm-jdk websphere-9

https://stackoverflow.com/a/35443723/1031689

  

设置系统属性com.ibm.xml.xlxp.jaxb.opti.level = 0 in   的WebSphere。使用此设置将导致JAXB引用   实施用于解组和编组而不是   WebSphere JAXB实现。

我在应用服务器上设置了这个&gt; server1&gt; <处理定义> Java虚拟机&gt; WebSphere 9.0.0.4中的自定义属性,然后停止并重新启动服务器,并在我的webapp中:

System.getProperty("com.ibm.xml.xlxp.jaxb.opti.level")

现在按预期返回0。

然而,

context.getClass().getName().startsWith("com.ibm.xml.xlxp2.jaxb")

仍然返回true。

Marshaller m=org.docx4j.jaxb.Context.jc.createMarshaller();
System.out.println(m.getClass().getName());

返回:

com.ibm.xml.xlxp2.jaxb.marshal.MarshallerProxy

(实际上,无论是否设置了com.ibm.xml.xlxp.jaxb.opti.level,都会返回MarshallerProxy)

当level = 0时,MarshallerProxy会调用参考实现吗?那是怎么回事?

1 个答案:

答案 0 :(得分:1)

答案:只有它无法加载com.ibm.jtc.jax.xml.bind.v2.runtime.JAXBContextImpl(位于com.ibm.jaxb.tools.jar中)

要看到这一点,在上下文对象上调用toString()非常有用:

Primary JAXBContext:
bundleresource://138.fwk797973828/com/ibm/xml/xlxp2/jaxb/JAXBContextImpl.class,
Version: 1.6.2-jaxb,
Timestamp: Tue, 18 Oct 2016 17:08:48 EDT,
Classes known to this context:
  [NONE] (Fallback JAXBContext will be used to process any requests.)

Fallback JAXBContext:
bundleresource://11.fwk797973828/com/ibm/jtc/jax/xml/bind/v2/runtime/JAXBContextImpl.class Build-Id: null

所以XLXP使用com.ibm.jtc.jax.xml.bind.v2.runtime.JAXBContextImpl。

现在,设置com.ibm.xml.xlxp.jaxb.opti.level=0

Primary JAXBContext:
bundleresource://138.fwk-1179731101/com/ibm/xml/xlxp2/jaxb/JAXBContextImpl.class,
Version: 1.6.2-jaxb,
Timestamp: Tue, 18 Oct 2016 17:08:48 EDT,
Classes known to this context:
  [NONE] (Fallback JAXBContext will be used to process any requests.)

Fallback JAXBContext:
bundleresource://11.fwk-1179731101/com/ibm/jtc/jax/xml/bind/v2/runtime/JAXBContextImpl.class Build-Id: null

也就是说,没有变化! IBM JAXB仍在使用中。

尝试改变它的两种方法:

  1. com.ibm.ws.prereq.xlxp.jar / META-INF / services / com.ibm.xml.xlxp.jaxb.fallback.context包含com.ibm.jtc.jax.xml.bind.v2.ContextFactory ;我们可以把其他东西放在那里
  2. 删除com.ibm.jaxb.tools.jar
  3. 我尝试删除com.ibm.jaxb.tools.jar。重启WAS后:

    Primary JAXBContext:
    bundleresource://138.fwk-218185936/com/ibm/xml/xlxp2/jaxb/JAXBContextImpl.class,
    Version: 1.6.2-jaxb,
    Timestamp: Tue, 18 Oct 2016 17:08:48 EDT,
    Classes known to this context:
      [NONE] (Fallback JAXBContext will be used to process any requests.)
    
    Fallback JAXBContext:
    jar:file:/home/jharrop/IBM/WebSphere/AppServer/java/8.0/jre/lib/rt.jar!/com/sun/xml/internal/bind/v2/runtime/JAXBContextImpl.class Build-Id: 1.8.0
    

    有趣的是,如果删除com.ibm.jaxb.tools.jar,com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl就在那里(至少在我的安装中)并使用了!所以我想你可以在com.ibm.ws.prereq.xlxp.jar / META-INF / services / com.ibm.xml.xlxp.jaxb.fallback.context中指定它

    如果您确实要删除com.ibm.jaxb.tools.jar,当您重新添加它时,请记住清除类缓存,以便WAS再次找到它(停止服务器,运行bin / clearClassCache):{ {3}}

    WebSphere 8.5.5.13(使用IBM Java 1.8.0_151 - 安装起来很痛苦!)看起来很相似。