【发布时间】:2015-11-19 14:19:17
【问题描述】:
我有许多 servlet,我正在重写从使用 PersistenceContext 到使用 @Injected DAO。
在 JSF 中,我可以在我的 @Produces 方法中获取对 FacesContext 的引用,并根据登录用户返回正确的 EM(或者在登录时使用默认值,有效用户可用)。
当我必须为注入不同 servlet 的相同 DAO 生成不同的 EM 并且要注入的 EM 取决于启动“注入链”的 Servlet 时,我该如何以干净的方式执行此操作?
预期结果:
Servlet 1 DaoA EntityM. x
+-----------+ +-----------+ +-----------+
| @Inject | Inject into| @Inject | Inject into| |
| DaoA daoA <-----+------+ E.M. em <------------+ |
| etc | | | //em x | | |
+-----------+ | +-----------+ +-----------+
| DaoB EntityM. x
| +-----------+ +-----------+
| | @Inject | Inject into| |
+------+ E.M. em <------------+ |
| //em x | | |
+-----------+ +-----------+
Servlet 2 DaoA EntityM. y
+-----------+ +-----------+ +-----------+
| @Inject | Inject into| @Inject | Inject into| |
| DaoA daoA <------------+ E.M. em <------------+ |
| | | //em y | | |
+-----------+ +-----------+ +-----------+
编辑:
我认为从技术上讲,我可以摆脱这样的事情,但是当 DAO 也被用于其他方式并且有许多 servlet 需要升级时,这将是一个巨大的混乱:
//In Servlet 1
@PersistenceContext(unitName="x")
EntityManager em;
@Inject
DaoA daoA;
@Inject
DaoB daoB;
@Postconstruct
public void postConstruct() {
daoA.setEm(em);
daoB.setEm(em);
}
//In Servlet 2
@PersistenceContext(unitName="y")
EntityManage r em;
@Inject
DaoA daoA;
@Postconstruct
public void postConstruct() {
daoA.setEm(em);
}
【问题讨论】:
标签: java jakarta-ee servlets cdi java-ee-6