Dozer のドキュメントには、サーバー上のアプリで DozerBeanMapper のインスタンスを 1 つだけ実行する必要があると記載されています。最初の開発ではこれを無視しましたが、今はこれを行うようにアプリを更新したいと考えています。
アプリケーションが Glassfish で起動したときに DozerBeanMapper クラスをインスタンス化するにはどうすればよいですか?また、アプリケーションが起動または新しくデプロイされたら、別のクラスでその「マップ」メソッドにアクセスするにはどうすればよいですか?
これは EJB 用であるため、サーブレットを使用してこれを行うことはできません。
OK、ようやくこのコードをリファクタリングする時間ができました。@Mikko Maunu からのポインタを使用して、質問を編集して、将来役に立つと思われる人のために、私のために働いているコードを提供しています。
package com.xyz.utilities.singleton;
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import org.dozer.DozerBeanMapper;
@Startup
@Singleton
public class DozerInstantiator {
private DozerBeanMapper mapper = null;
@PostConstruct
void init() {
mapper = new DozerBeanMapper();
}
public DozerBeanMapper getMapper() {
return mapper;
}
}
そして、ここに簡単なユースケースがあります:
EJB メンバー変数をクライアント クラスに注入します。
@EJB
DozerInstantiator di;
クライアント クラスのどこかにあるメソッド内で、次のように dozer マッパーを呼び出すことができます。
Credentials credentials = di.getMapper().map(credentialsDTO, Credentials.class);
// or
Credentials credentials = new Credentials();
di.getMapper().map(credentialsDTO, credentials);
これが間違っているか、ベースから外れている場合は、誰かがコメントを残してください. それまでは、これでうまくいくようですので、Mikko の意見で開発したこのソリューションを使用します。