我有一些无状态的EJB,它们都有一个相同的私有方法:
private User getLoggedinUser() {
String username = sessionContext.getCallerPrincipal().getName();
return entityManager.createNamedQuery(User.findByUsername, User.class)
.setParameter("username", username).getSingleResult();
}
避免此代码重复的最佳方法是什么?将getLoggedinUser()
外包到另一个bean并将其注入我现有的EJB中?
答案 0 :(得分:0)
作为一项规则,EJB应该高度具有凝聚力,而SOA体系结构往往像Facades(Service Facades)一样工作。因此,这取决于EJB职责。如果是具有大量辅助方法的EJB,则可以将它们提取到专用服务(请记住,CDI支持继承模型,对于对某些帮助程序进行分组可能很有用)。我更倾向于避免在方法之间传递entityManager,主要是因为使用参数加载方法(越来越好),最后在同一事务中工作的所有EJB和服务共享持久化上下文。
另一种方法是使用Interceptor,这个想法是基于Decorator模式,但Interceptors暗示了一点 magic ,所以,只有当你想要完成前提条件或交叉关注时才使用它