WebSphere';s JAXB MarshallerProxy是否使用参考实现?

WebSphere';s JAXB MarshallerProxy是否使用参考实现?,jaxb,websphere,ibm-jdk,websphere-9,Jaxb,Websphere,Ibm Jdk,Websphere 9,在 在中设置系统属性com.ibm.xml.xlxp.jaxb.opti.level=0 WebSphere。使用此设置将导致JAXB引用 用于解组和编组的实现,而不是 WebSphereJAXB实现 我在WebSphere 9.0.0.4中的“应用程序服务器”>“服务器1”>“流程定义”>“Java虚拟机”>“自定义属性”中设置了此设置,然后停止并重新启动服务器,并在我的webapp中: System.getProperty("com.ibm.xml.xlxp.jaxb.opti.level"

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

我在WebSphere 9.0.0.4中的“应用程序服务器”>“服务器1”>“流程定义”>“Java虚拟机”>“自定义属性”中设置了此设置,然后停止并重新启动服务器,并在我的webapp中:

System.getProperty("com.ibm.xml.xlxp.jaxb.opti.level")
现在返回0,如预期的那样

但是,

context.getClass().getName().startsWith("com.ibm.xml.xlxp2.jaxb")
仍然返回true

返回:

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


当级别=0时,MarshallerProxy是否调用引用实现?它就是这样工作的吗?

回答:只有当它不能加载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.ws.prereq.xlxp.jar/META-INF/services/com.ibm.xml.xlxp.jaxb.fallback.context包含com.ibm.jtc.jax.xml.bind.v2.ContextFactory;我们可以在里面放些别的东西
  • 删除com.ibm.jaxb.tools.jar
  • 我尝试删除com.ibm.jaxb.tools.jar。重新启动后:

    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):


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

    如果删除com.IBM.jaxb.tools.jar,则服务器启动会抛出错误NoClassDefFoundError:com.IBM.wsspi.webvcs.desc.WSDescriptionBuilderFactory,并且无法登录到管理控制台
    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