1

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

在 Eclipse 中运行一个简单的测试(封送数据并对其进行验证)工作正常,但是一旦我在控制台(mvn 测试)中运行测试,我就会得到“缺少 @XmlRootElement 注释”。

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

我知道在 JAXBElement 中包装我的根元素的可能性 - 但由于某种原因,它在没有注释和包装的情况下在 eclipse 中工作。

4

2 回答 2

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,无论它们在哪里。

于 2013-05-16T09:01:03.073 回答
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);
于 2013-05-15T16:58:04.943 回答