3

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?

4

1 に答える 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 に答える