Использует ли 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 все еще используется.
Два способа попытаться изменить это:
- 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): http://www-01.ibm.com/support/docview.wss?uid=swg21607887
WebSphere 8.5.5.13 (с использованием IBM Java 1.8.0_151 - какая сложность в установке!) Выглядит аналогично.