2

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

在 WebSphere 中设置系统属性 com.ibm.xml.xlxp.jaxb.opti.level=0。使用此设置将导致使用 JAXB 引用实现来进行解组和编组,而不是使用 WebSphere JAXB 实现。

我在 WebSphere 9.0.0.4 中的应用程序服务器 > server1 > 进程定义 > Java 虚拟机 > 自定义属性中进行了设置,然后停止并重新启动服务器,并在我的 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 是否调用参考实现?它是这样工作的吗?

4

1 回答 1

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

我尝试删除 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):http:// www-01.ibm.com/support/docview.wss?uid=swg21607887

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

于 2018-02-10T07:24:47.220 回答