Jakarta ee JavaEE7:@products/@Inject优先于@EJB?

Jakarta ee JavaEE7:@products/@Inject优先于@EJB?,jakarta-ee,jpa,Jakarta Ee,Jpa,环顾StackOverflow,我发现这表明@products/@Inject是一种方法,除非您特别需要一个远程Bean。此外,Adam Bien说,“正确的”EE 7注入实体管理器的方法是什么?目前我有这样的代码: @Path("/userdb") public class UserDBInterface { @PersistenceContext private EntityManager em; @GET @Produces("text/plain")

环顾StackOverflow,我发现这表明
@products
/
@Inject
是一种方法,除非您特别需要一个远程Bean。此外,Adam Bien说,“正确的”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:在提交javax.transaction.RollbackException期间,具有事务注释和所需异常TxType的托管bean遇到异常:标记为回滚的事务

现在,请看前面提到的答案,并提出如下解决方案:

public class Resource {
    @PersistenceContext
    @Produces
    EntityManager em;
}
实际上,我已经把它放在我的
@WebListener
实现中了
ServletContextListener
。然后我的使用代码变成:

@Path("/userdb")
public class UserDBInterface {
    @Inject private EntityManager em;

    // ...etc as above
}
但是,我现在得到一个错误:

javax.servlet.ServletException:多重异常有1个异常。他们是: 1.org.glassfish.hk2.api.unsatifiedDependencyException:在被注射者处没有可用于注射的对象(requiredType=EntityManager,parent=UserDBInterface,限定符={}),position=-1,optional=false,self=false,unqualified=null,1502799812)

如果我删除了
@Transactional
,则注入似乎有效,但我得到了一个:

javax.servlet.ServletException:javax.persistence.TransactionRequiredException


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

Adam Bien是JavaEE7中ECB(实体、控制、边界)模式的支持者。在这种情况下,边界层是JAX-RS端点,它不会注入PersistenceManager,而是注入(很可能是
@Stateless
)EJB(控制层)。EJB将注入其PersistenceContext
@PersistenceContext
。EJB本身将通过
@EJB
注入JAX-RS端点

在上面的具体示例中,您看到了“带有事务注释和TxType的托管bean在提交过程中遇到了所需异常”-您能用此异常的详细信息编辑您的问题吗?@NBW,我在JAX-RS 2.0中使用了GlassFish 4.0,但我了解到这有点问题,所以我升级到了GF 4.0.1-b3和JAX-RS 2.5,我更新了代码,只做了一个直接的
@PersistenceContext EntityManager em和它似乎工作。我还是一个初学者(也许工具也还不成熟),所以它看起来总是很随机的,关于什么工作或不工作。肯很高兴它为你工作。GF4现在已经升级到了升级版10,所以你可能会对此感兴趣。我在构建<8时遇到了一些问题。他们在今年秋天JavaOne发布的时候正朝着4.1版本迈进,这样每个升级的版本都会变得更好。似乎有迹象表明JAX-RS和CDI在同一类中使用时相互干扰。谢谢你解释亚当边的立场-我真的应该买他的书!就我个人而言,我不喜欢使用CDI注入PersistenceContext——就JavaEE7而言,我更喜欢使用EJB3.1bean(它们提供了更丰富的事务性功能)作为我的控制器类。JavaEE8将进一步实现CDI和EJB之间的对等。另一个很好的资源是[github上的Java EE示例]()