Java EE と JBoss Application Server を使用してペイント サービスを実装したいと考えています。
URL経由で呼び出されるメソッドを想像してください
http://mypaint.com/apply?image=1&action=line&from=10,10&to=100,10
id 1 の画像にアクションを適用します。アクションは「点 (10,10) から点 (100,10) まで線を引く」です。
「適用」メソッドは次のようになります。
@Inject
private ImageProcessorServer processors
@GET
@Path("/apply")
public Response apply(
@QueryParam(value = "image") int imageId,
@QueryParam(value = "action") String action,
//some parameters more...
) {
… //check if user is allowed to access the image
ImageProcessor processor = processors.get(imageId);
//get image processor by image id
processor.apply(action/*, from, to*/);
}
「ImageProcessorServer」は次のようになります。
@Singleton
@Startup
public class ImageProcessorServer {
private Map<Integer, ImageProcessor> processors =
new HashMap<Integer, ImageProcessor>();
@Lock(LockType.WRITE)
public ImageProcessor get(int imageId) {
ImageProcessor processor = processors.get(imageId);
if(processor == null) {
processor = new ImageProcessor(imageId);
processors.put(imageId, processor);
}
return processor;
}
}
Image ごとに 1 つの ImageProcessor のみが生成されるようにするためのシングルトンです (相互排除下での生成 → Write-Lock)。
問題: ImageProcessor クラスにデータ アクセス オブジェクト (データベースを操作するため) を挿入するにはどうすればよいですか? DAO は単純なステートレス Bean です。私の ImageProcessor は次のようになります。
public class ImageProcessor {
@Inject
private ActionDao actionDao;
private Image image;
public ImageProcessor(int imageId) { … }
public void apply(String action, ...) {
//change image
//actionDao.persist(actionObject)
}
}
しかし、これはうまくいきません。ActionDao は NULL です。
私の現在の解決策は、次のように、DAO を使用しているすべてのメソッドでパラメーターとして DAO を渡すことです。
public ImageProcessor(int imageId, ImageDao dao) { … }
public void apply(String action, …, ActionDao dao, ImageDao dao2, …) {
//change image
//dao.persist(actionObject)
}
同じイメージ ID を持つリクエストは、同じイメージ プロセッサを共有することが重要です。クライアントは、異なるイメージ ID を持つ複数のリクエストを持つことができます。
このリンク下 POJO で依存性注入を使用して EJB を注入 すると、ファクトリを使用できると言われています。しかし、私はこれを解決する方法がわかりません。誰かがこれのコードを提供できますか?
誰かが私の問題を解決するエレガントな方法を知っていますか?