Java EE 7:@ Produces / @Inject首选@EJB?

时间:2014-08-04 01:18:27

标签: java-ee jpa

环顾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没有可用于注入的对象(r​​equiredType = EntityManager,parent = UserDBInterface,qualifiers = {}),position = -1,optional = false,self = false,unqualified = NULL,1502799812)

如果我删除@Transactional注射似乎有效,但我得到了:

  

javax.servlet.ServletException:javax.persistence.TransactionRequiredException

我确定我错过了一些简单的东西!

1 个答案:

答案 0 :(得分:1)

Adam Bien是使用Java EE 7的ECB(实体,控制,边界)模式的支持者。在这种情况下,您的边界层是您的JAX-RS端点,它不会注入PersistenceManager,但会注入(大多数)可能@Stateless)EJB(控制层)。 EJB将注入其PersistenceContext @PersistenceContext。 EJB本身将使用@EJB注入JAX-RS端点。