【发布时间】:2011-05-02 21:53:38
【问题描述】:
除了将jaxb.properties 放入每个单独的包之外,对于分布在多个 Java 包中的域类,有没有办法将 MOXy 指定为我的 JAXB 实现?
【问题讨论】:
标签: java jaxb eclipselink moxy
除了将jaxb.properties 放入每个单独的包之外,对于分布在多个 Java 包中的域类,有没有办法将 MOXy 指定为我的 JAXB 实现?
【问题讨论】:
标签: java jaxb eclipselink moxy
要将EclipseLink MOXy 指定为 JAXB 提供者,您需要将 jaxb.properties 放入域对象的其中一个包中,即 传入 以引导 JAXBContext。例如,如果您的 JAXBContext 将基于以下 2 个类:
example.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;
}
example.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;
}
example/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
【讨论】:
jaxb.properties 添加到一个包中似乎只会影响该特定包中的类。
JAXBContext.newInstance(Foo.class).getClass().getName() 的两个不同Foo.class 值的结果;一个在包含jaxb.properties 的包中,一个在不包含该文件的包中。无论如何,这个问题比我知道你现在正在处理的另一个问题要少。在更大的问题得到解决之前,我将暂时提出这个问题。谢谢你的帮助,顺便说一句!
jaxb.properties。感谢您的帮助。