奇怪的“缺少@XmlRootElement注释”错误,只有Maven,才能在Eclipse中运行

时间:2013-05-15 16:50:31

标签: xml jaxb eclipselink moxy

我编写了编组xml数据的代码。在将数据编组到输出之前,我以Blaise Doughan建议的方式验证数据here

在eclipse中运行一个简单的测试(编组数据验证它)工作正常,但是一旦我在控制台(mvn test)中运行测试,我就会“错过@XmlRootElement注释”。

代码由moxy生成 - 没有此注释。我的问题是为什么它在Eclipse中有效?或者如何让它在控制台中运行?我唯一的解释是一些依赖是不同的(可能eclipse使用一些内部的xml东西?)

我知道可以将我的root元素包装在JAXBElement中 - 但由于某种原因,它在没有注释且没有包装的eclipse中工作。

2 个答案:

答案 0 :(得分:1)

EclipseLink JAXB (MOXy)将在没有@XmlRootElement注释的情况下编组,JAXB参考实现会抱怨。

我怀疑您在Maven设置的正确位置没有jaxb.properties文件。如果您的域模型位于com.example.foo包中,则jaxb.properties文件应位于以下位置。

src/main/resources/com/example/foo/jaxb.properties 

有关示例项目,请参阅:

<强>更新

  

是否有可能告诉moxy / marshaller使用固定的   jaxb.properties而不是在包文件夹中深入搜索(我有   很多都是相同的)

如果您希望MOXy始终用作JAXB(JSR-222)提供程序,那么您可以将以下内容添加到类路径中:

META-INF/services/javax.xml.bind.JAXBContext

javax.xml.bind.JAXBContext文件将包含以下内容:

org.eclipse.persistence.jaxb.JAXBContextFactory

否则,您始终可以使用本机MOXy API来创建JAXBContext:

    JAXBContext jc = org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(new Class[] {Foo.class}, null);

答案 1 :(得分:1)

Blaise是对的,jaxb.properties必须位于与src / main / java文件夹相同的文件夹结构(包)中的资源下。 在我的情况下,我有20个这样的文件(和20 xsd的jaxb类)。要使其无需手动复制,请添加到pom:

<build>
...
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/jaxb.properties</include>
            </includes>
        </resource>
    </resources>
...
</build>

第一个“资源”添加普通资源文件夹。第二个添加了src / main / java,但只包括所有jaxb.properties。