Использует ли JSXB MarshallerProxy в WebSphere эталонную реализацию?

На /questions/18372496/jaxb-v-veb-sfere/18372511#18372511

установка системного свойства com.ibm.xml.xlxp.jaxb.opti.level=0 в WebSphere. Использование этого параметра приведет к тому, что эталонная реализация JAXB будет использоваться для демаршаллинга и маршалинга вместо реализации WebSphere JAXB.

Я установил это в Серверы приложений> server1 > Определение процесса> Виртуальная машина Java> Пользовательские свойства в WebSphere 9.0.0.4, затем остановил и перезапустил сервер, и в моем веб-приложении:

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

теперь возвращает 0, как и ожидалось.

Тем не мение,

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

все еще возвращает истину.

а также

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

возвращает:

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

(на самом деле, это возвращает MarshallerProxy независимо от того, установлено com.ibm.xml.xlxp.jaxb.opti.level или нет)

Когда уровень =0, MarshallerProxy вызывает эталонную реализацию? Это так работает?

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. После перезапуска был:

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 - какая сложность в установке!) Выглядит аналогично.

Другие вопросы по тегам