Is there a way to specify MOXy as my JAXB implementation, for domain classes spread across multiple Java packages, other than putting jaxb.properties
into every single package?
1350 次
1 に答える
3
EclipseLink MOXyをJAXBプロバイダとして指定するには、JAXBContextをブートストラップするために渡される、ドメイン・オブジェクトのパッケージの1つにjaxb.propertiesを配置する必要があります。たとえば、JAXBContext が次の 2 つのクラスに基づく場合:
- example.foo.Foo
- example.bar.Bar
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;
}
例/foo/jaxb.properties
JAXB の MOXy 実装を使用する必要があることを指定するには、次のエントリを含む jaxb.properties ファイルを Foo クラスと同じパッケージに配置します。
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 に答える