Jakarta ee JavaEE7:@products/@Inject优先于@EJB?
环顾StackOverflow,我发现这表明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")
@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示例]()