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会调用参考实现吗?那是怎么回事?
答案 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仍在使用中。
尝试改变它的两种方法:
我尝试删除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 - 安装起来很痛苦!)看起来很相似。