环顾StackOverflow我看到answers like this one表明@Produces
/ @Inject
是要走的路,除非有人特别需要远程Bean。此外,Adam Bien说DAO is dead,那么@Inject
一个EntityManager的“正确”EE 7方式是什么?目前我有这样的代码:
@Path("/userdb")
public class UserDBInterface {
@PersistenceContext
private EntityManager em;
@GET
@Produces("text/plain")
@Transactional
public String dbInteraction()
{
User user1 = new User();
user1.setLogin("ken");
user1.setSalt(JpaSecurityUtils.getSalt());
user1.setPassword(JpaSecurityUtils.hashPassword("password", user1.getSalt()));
em.persist(user1);
return "Created User DB";
}
}
然而,这给了我这个错误:
javax.servlet.ServletException:javax.transaction.TransactionalException:提交事务注释和TQUType为REQUIRED的托管bean在提交期间遇到异常javax.transaction.RollbackException:标记为回滚的事务。
现在,前面引用的答案和this one建议的解决方案如下:
public class Resource {
@PersistenceContext
@Produces
EntityManager em;
}
我实际上已将其放在我@WebListener
ServletContextListener
的实施中。然后我的使用代码变为:
@Path("/userdb")
public class UserDBInterface {
@Inject private EntityManager em;
// ...etc as above
}
但是,我现在收到一个错误:
javax.servlet.ServletException:MultiException有1个例外。他们是: 1. org.glassfish.hk2.api.UnsatisfiedDependencyException:Injectee没有可用于注入的对象(requiredType = EntityManager,parent = UserDBInterface,qualifiers = {}),position = -1,optional = false,self = false,unqualified = NULL,1502799812)
如果我删除@Transactional
注射似乎有效,但我得到了:
javax.servlet.ServletException:javax.persistence.TransactionRequiredException
我确定我错过了一些简单的东西!
答案 0 :(得分:1)
Adam Bien是使用Java EE 7的ECB(实体,控制,边界)模式的支持者。在这种情况下,您的边界层是您的JAX-RS端点,它不会注入PersistenceManager,但会注入(大多数)可能@Stateless
)EJB(控制层)。 EJB将注入其PersistenceContext @PersistenceContext
。 EJB本身将使用@EJB
注入JAX-RS端点。