我想使用 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;
}
}
确保每个图像只生成一个 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 据说可以使用工厂。但我不知道如何解决这个问题。有人可以为此提供代码吗?
有人知道解决我的问题的优雅方法吗?