1

Morphia を使用してオブジェクトを MongoDB に永続化する Java EE 6 アプリケーションを作成しています。必要に応じて DAO クラスを作成できるようにしたい@Injectので、DAO を適切にインスタンス化する Factory クラスを作成しました。次のようになります。

public class MyDAOFactory {

    @Inject
    private Datastore mongoDatastore = null;

    /**
     * Creates the DAO
     */
    @Produces
    @ApplicationScoped
    public MyDAO createDAO() {
        MyDAO dao = new MyDAO(
                this.mongoDatastore);
        return dao;
    }
}

コードは正常にコンパイルされますが、JBoss EAP 6.1 でアプリケーションを実行するとMyDAO、no-arg コンストラクターがないためにエラーが発生します。1 つ追加しますが、Morphia BasicDAO クラスにも 1 つがないため、そのように機能するかどうかはわかりません。

@InjectDAO インスタンスを EJB やサーブレットなどに入れる方法はありますか? または、毎回手動でインスタンス化する必要がありますか?

4

1 に答える 1

2

MyDAO何らかの理由で、CDI には引数なしのコンストラクターが必要なようです。おそらく、この Bean の使用方法が原因です (考えられる理由については、仕様 ch.5.4「クライアント プロキシ」を参照してください)。

基本クラスにはコンストラクターがないため、デフォルトのコンストラクターを作成することはできません。また、コードからわかるように、コンストラクターsuper引数をすぐに使用します。したがって、引数なしのコンストラクターから null を渡すとsuper()、エラーがスローされます。

私の提案は、インターフェイス (オプションで を拡張org.mongodb.morphia.dao.DAO) を作成することです。たとえばMyDAOInterface、 のすべてのパブリック ビジネス メソッドを持っていますMyDAO。次に、MyDAOこのインターフェイスを実装するように変更し、プロデューサーが返すように変更しますMyDAOInterface

public interface MyDAOInterface extends DAO {...}

public class MyDAO implements MyDAOInterface {
    // same implementation
}

public class MyDAOFactory {
    @Inject
    private Datastore mongoDatastore = null;

    /**
     * Creates the DAO
     */
    @Produces
    @ApplicationScoped
    public MyDAOInterface createDAO() {
        MyDAO dao = new MyDAO(this.mongoDatastore);
        return dao;
    }
}

ところで、インターフェイスへのプログラミングには、コードをよりテストしやすくするという追加の利点があるため、わずかな手間をかけるだけの価値があります。

于 2013-10-01T14:55:07.650 に答える