1

私は静的ファクトリメソッドを次のように定義しています:

@XmlType(factoryClass=DummyFactory.class, factoryMethod="createNew")
public abstract MyClass() {
}

私がファクトリメソッドを使用している理由MyClassは抽象的であり、そのインスタンスを取得する方法はクラスの特定のアノテーションに依存するためです。このロジックはファクトリメソッドに組み込まれていcreateNewます。

さらに、ファクトリクラスDummyFactoryは抽象です。私が理解している限り、ファクトリメソッドが静的である場合、ファクトリクラスはデフォルトのコンストラクタを提供する必要はありません(http://download.oracle.com/javaee/6/api/javax/xml/bind/annotation/XmlType.html) 。

これは、ファクトリクラスがどのように見えるかを単純化したものです。

public abstract class DummyFactory {
    public static MyClass createNew() {
        // code for returning a new instance of MyClass
    }   
}

ただし、XMLドキュメントをアンマーシャリングしようとすると、次の例外が発生します。

Exception [EclipseLink-171] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The factory class does not define a public default constructor, or the constructor raised an exception.
Internal Exception: java.lang.InstantiationException

最初はファクトリクラスとメソッドの説明で正しく何かが得られないと思いましたが、次にJAXB RIを試してみましたが、これは問題なく機能しています。だから私の質問は:

MOXyを抽象ファクトリクラスで動作させる方法はありますか?

(JAXB RIは私に他の種類の問題を与えています、それが私がそれを使用したくない理由です)。

4

1 に答える 1

2

この問題のバグを入力していただきありがとうございます ( https://bugs.eclipse.org/362984 )。この問題は EclipseLink 2.4 ストリームで修正されており、本日 (2011 年 11 月 9 日) に EclipseLink 2.3.2 ストリームにバックポートされる予定です。以下から夜間ダウンロードを取得する修正を試すことができます。

@XmlType次のような注釈を使用してファクトリ クラスを指定すると、次のようになります。

@XmlType(factoryClass=DummyFactory.class, factoryMethod="createNew")
public abstract MyClass() {
}

次のタイプのファクトリ クラスがサポートされています。

静的メソッドを持つファクトリ

このバグ修正により、MOXy がファクトリ メソッドを使用してインスタンスのインスタンスを作成するときに、MyClassのインスタンスがDummyFactory作成されなくなりました。

public abstract class DummyFactory {
    public static MyClass createNew() {
        // code for returning a new instance of MyClass
    }   
}

インスタンス メソッドを持つファクトリ

静的メソッドに加えて、MOXy ではインスタンス レベルの作成メソッドを指定できます。これらのメソッドに対して、MOXy はファクトリ クラスのインスタンスを作成します。

public class DummyFactory {
    public MyClass createNew() {
        // code for returning a new instance of MyClass
    }   
}

この構成は JAXB RI では許可されておらず、次の例外が発生します。

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Factory class "forum8022136.DummyFactory" does not have static zero args factory method "createNew".
    this problem is related to the following location:
        at forum8022136.MyClass

    at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:436)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:376)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    at forum8022136.Demo.main(Demo.java:14)
于 2011-11-09T14:50:52.670 に答える