3

有没有办法将 MOXy 指定为我的 JAXB 实现,对于分布在多个 Java 包中的域类,而不是放入jaxb.properties每个单独的包中?

4

1 回答 1

3

要将EclipseLink MOXy指定为 JAXB 提供程序,您需要将 jaxb.properties 放入您的域对象的包之一中,该包被传入以引导 JAXBContext。例如,如果您的 JAXBContext 将基于以下 2 个类:

  • 例子.foo.Foo
  • 例子.bar.Bar

例子.foo.Foo

package example.foo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

import example.bar.Bar;

@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    private Bar bar;

}

例子.bar.Bar

package example.bar;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

import example.foo.Foo;

@XmlAccessorType(XmlAccessType.FIELD)
public class Bar {

    private Foo foo;

}

示例/foo/jaxb.properties

为了指定应该使用 JAXB 的 MOXy 实现,我们将在与 Foo 类相同的包中放置一个具有以下条目的 jaxb.properties 文件。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示

由于 Foo 和 Bar 类相互引用,最终 JAXBContext 将包含关于它们的元数据,但根据我们创建 JAXBContext 的方式,提供者可能会有所不同。

package example;

import javax.xml.bind.JAXBContext;
import example.foo.Foo;
import example.bar.Bar;

public class Demo {

    public static void main(String[] args) throws Exception{
        System.out.println(JAXBContext.newInstance(Foo.class).getClass());
        System.out.println(JAXBContext.newInstance(Bar.class).getClass());
        System.out.println(JAXBContext.newInstance(Foo.class, Bar.class).getClass());
    }

}

运行上面的代码会产生:

class org.eclipse.persistence.jaxb.JAXBContext
class com.sun.xml.bind.v2.runtime.JAXBContextImpl
class org.eclipse.persistence.jaxb.JAXBContext
于 2011-05-02T22:54:16.773 回答