从 WildFly 中的另一个模块使用 JAXBContext 解组

Unmarshalling with JAXBContext from another Module in WildFly

野蝇8.2.1。

我在 modules/system/layers/base 中有一个 "common" 模块。

我还有一个 EAR,里面有 EJB-JAR 在这个 EAR 中,我有 jboss-deployment-structure.xml 依赖于 "common" 模块。它工作正常,我可以使用该模块中的 类。

但是,当我尝试在该模块内的包上构造 JAXBContext,并尝试将一些 xml 解组为对象时,我得到

unexpected element (uri:"{my namespace}", local:"{my local name}"). Expected elements are (none)

如果我将 classes 移动到 EJB-JAR 中(全部在一个模块中),解组工作正常。

所以这是模块分离的结果。

我尝试从 JAXBContext 对象打印 .toString()

只有一个模块:所有带注释的 class 都在那里。

有两个模块:那里只有 ObjectFactory class 来自指定的包。

如果我将 class 显式添加到 JAXBContext,我可以从 .toString() 中看到所有需要的 classes,但解组仍然无法进行。我得到空对象。

它可能是什么?谢谢。

我找到了解决方案。

但我不完全明白问题出在哪里 :) 它与模块分离、class 加载和 class 类 OSGi 基础设施中的隔离有关。

为了解决这个问题,必须在 module.xml 中添加依赖到 "common" 模块,这样的 "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 不足以在该部署中使用公共模块中的那些 class 创建 JAXBContext。也需要添加到common模块中。