返回的JAXBContext
将始终来自单个提供者。下面我将通过一个例子来演示如何确定提供者。
包 #1 - forum17649220.foo
jaxb.properties
此包包含jaxb.properties
带有以下条目的文件,表明 MOXy 是 JAXB 提供程序(请参阅:http ://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html )。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
富
Foo
包含对 的引用Bar
。这意味着无论在处理JAXBContext
时如何创建Foo
元数据,也会为Bar
.
package forum17649220.foo;
import forum17649220.bar.Bar;
public class Foo {
public Bar bar;
}
jaxb.index
JAXB 实现不进行包扫描。文件jaxb.index
可用于启用JAXBContext
按包名称创建。
Foo
包 #2 - forum17649220.bar
酒吧
Bar
包含对 的引用Foo
。这意味着无论在处理JAXBContext
时如何创建Bar
元数据,也会为Foo
.
package forum17649220.bar;
import forum17649220.foo.Foo;
public class Bar {
public Foo foo;
}
jaxb.index
Bar
演示代码
我们将创建JAXBContext
几种不同方式的实例,以查看作为 JAXB 提供者所选择的内容。请注意,无论使用何种 JAXB 提供程序,都将处理两个类的Foo
和Bar
对彼此元数据的引用。
演示
package forum17649220;
import javax.xml.bind.JAXBContext;
import forum17649220.bar.Bar;
import forum17649220.foo.Foo;
public class Demo {
public static void main(String[] args) throws Exception {
System.out.println(JAXBContext.newInstance("forum17649220.foo").getClass());
System.out.println(JAXBContext.newInstance("forum17649220.foo:forum17649220.bar").getClass());
System.out.println(JAXBContext.newInstance("forum17649220.bar").getClass());
System.out.println(JAXBContext.newInstance(Foo.class).getClass());
System.out.println(JAXBContext.newInstance(Foo.class, Bar.class).getClass());
System.out.println(JAXBContext.newInstance(Bar.class).getClass());
}
}
输出
我们可以从输入中看到,只要forum17649220.foo
在创建时包含该包或该包中的一个类,JAXBContext
那么 MOXy 将因为该jaxb.properties
文件而成为提供者。
class org.eclipse.persistence.jaxb.JAXBContext
class org.eclipse.persistence.jaxb.JAXBContext
class com.sun.xml.bind.v2.runtime.JAXBContextImpl
class org.eclipse.persistence.jaxb.JAXBContext
class org.eclipse.persistence.jaxb.JAXBContext
class com.sun.xml.bind.v2.runtime.JAXBContextImpl