2015-10-07 2 views
1

WildFly 8.2.1.Unmarshalling с JAXBContext из другого модуля в WildFly

У меня есть «общий» модуль в модулях/системе/слоях/базе.

Также у меня есть EAR с EJB-JAR внутри В этом EAR у меня есть jboss-deployment-structure.xml с зависимостью от «общего» модуля. Он работает нормально, я могу использовать Классы из этого модуля.

Но, когда я пытаюсь построить JAXBContext на упаковке внутри этого модуля, и попытаться распаковать некоторые XML в объект, я получаю

неожиданный элемент (URI: «{мое пространство имен}», местные:» {мое местное имя} "). Ожидаемые элементы (нет)

Если я перемещаю эти классы внутри EJB-JAR (все в одном модуле), то unmarshalling работает нормально.

Так что это что-то происходит от разделения модулей.

Я попытался напечатать .toString() от JAXBContext объект.

С одним модулем: все аннотированные классы есть.

С двумя модулями: существует только ObjectFactory класс из указанного пакета.

Если я явно добавляю класс в JAXBContext, я вижу все классы необходимости от .toString(), но unmarshalling все еще не wirking. Я получаю нулевой объект.

Что это может быть? Спасибо.

+0

Возможно, посмотрите альтернативный способ создания JAXBContext и укажите TCCL вместо стандартного: https://docs.oracle.com/javaee/5/api/javax/xml/bind/JAXBContext.html# newInstance (java.lang.String,% 20java.lang.ClassLoader) – Franck

+0

@Franck, Да, я попытался использовать другой метод 'newInstance' и указать' ClassLoader'. С обоими загрузчиками классов, из аннотированного класса и с помощью API 'org.jboss.modules.Module'. Не работал. Результат тот же. –

+0

Вы пытались использовать Thread.currentThread(). GetContextClassLoader()? – Franck

ответ

1

Я нашел решение.

Но я не совсем понимаю, в чем была проблема :) Это что-то с разделением модулей, загрузкой классов и изоляцией класса в OSGi-подобной инфраструктуре.

Чтобы решить эту проблему, необходимо добавить зависимость в module.xml для «общего» модуль для «javax.xml.bind.api» подобное:

<?xml version='1.0' encoding='UTF-8'?> 
<module xmlns="urn:jboss:module:1.3" name="{module name}"> 
    <resources> 
     <resource-root path="."/> 
     <resource-root path="common-types-1.0.jar"/> 
    </resources> 
    <dependencies> 
     <module name="javax.xml.bind.api"/> 
    </dependencies> 
</module> 

Казалось бы, когда это модуль зависит от некоторого развертывания, недостаточно javax.xml.bind.api для представления в этом развертывании для создания JAXBContext с этими классами из общего модуля. Он также должен быть добавлен к общему модулю.