9

XJCを使用して、各パッケージにObjectFactoryクラスを含む2つの異なるJAXBメタデータパッケージを作成します(このアプローチが問題ないかどうかはわかりませんが、2つの異なるXSDを使用できます)。

コストがかかるため、操作ごとに1つのJAXBContextのみを作成することをお勧めします。それで、私がここでしていることは有効で良い習慣であるかどうか疑問に思いますか?

    JAXBContext jaxbContext = JAXBContext.newInstance("com.package.one");
    Unmarshaller jaxbUnmarshaller1 = jaxbContext.createUnmarshaller();

    JAXBContext jaxbContext2 = JAXBContext.newInstance("com.package.two");
    Unmarshaller jaxbUnmarshaller2 = jaxbContext2.createUnmarshaller();

2つのパッケージを一緒に初期化しようとすると、「要素名{ }値に複数のマッピングがあります」という例外が発生します。値は両方のパッケージのクラスです。

 JAXBContext jaxbContext = JAXBContext.newInstance("com.package.one:com.package.two");
4

1 に答える 1

23

JAXBContextのJavadocから:

クライアントアプリケーションは通常、これらのいずれかを使用してこのクラスの新しいインスタンスを取得します
newInstanceメソッドには2つのスタイルがありますが、他にも特殊な形式があります。
利用可能な方法:

JAXBContext.newInstance( "com.acme.foo:com.acme.bar")
JAXBContextインスタンスは、コロンで区切られたJavaパッケージのリストから初期化されます
名前。各Javaパッケージには、JAXBマップクラス、スキーマ派生クラス、および/または
ユーザー注釈付きクラス。さらに、javaパッケージにはJAXBパッケージアノテーションが含まれている場合があります
それを処理する必要があります。(JLS 3rd Editionのセクション7.4.1。パッケージの注釈を参照してください)。

JAXBContext.newInstance(com.acme.foo.Foo.class)
JAXBContextインスタンスは、パラメーターとして渡されたクラスで初期化され、
これらのクラスから静的に到達可能なクラス。newInstance(Class ...)を参照してください
詳細については。

共有コンテキストを使用して、パッケージ名のリストで初期化できます。

コード例:

package test.jaxb.one;

@XMLRootElement
@XMLType(name = "test.jaxb.one.SimpleObject")
@XMLAccessorType(XMLAccessType.FIELD)
public class SimpleObject implements Serializable {
    private static final long serialVersionUID = 54536613717262557148L;

    @XmlElement(name = "Name")
    private String name;

    // Constructor, Setters/Getters
}

そしてこれ:

package test.jaxb.two;

@XMLRootElement
@XMLType(name = "test.jaxb.two.SimpleObject")
@XMLAccessorType(XMLAccessType.FIELD)
public class SimpleObject implements Serializable {
    private static final long serialVersionUID = -4073071224211934153L;

    @XmlElement(name = "Name")
    private String name;

    // Constructor, Setters/Getters
}

ついに:

public class JAXBTest {
    @Test
    public void testContextLoad() throws Exception {
        final JAXBContext context = JAXBContext
            .newInstance("test.jaxb.one:test.jaxb.two");
        Assert.assertNotNull(context);
    }
}
于 2012-11-15T14:37:39.463 に答える