@Stateless与@RequestScoped
我正在学习使用 JAX-RS 进行一些安静的 API 开发,并且有一个关于我的资源类的问题。
我的理解是,我的资源类应该是 RequestScoped,但是,当它被 RequestScoped 时,我对实体管理器的 persist 方法的调用会引发一个 TransactionRequiredException。
如果我将我的资源类更改为无状态,那么一切都很好,实体管理器可以保留没有任何问题。
我对JavaEE还很陌生,想知道为什么会发生这种情况,以及@Stateless注释做了什么,允许持久性上下文正确注入。我还想知道 JAX-RS 资源类是无状态的而不是 RequestScoped 是否存在任何问题,因为我见过的大多数教程都有这些问题。
我在下面提供了一些示例代码来说明。
@Path("Things")
//@Stateless //works just fine when em.persist() is called
@RequestScoped //throws transactionrequiredexception when em.persist() is called
public class ThingsResource{
@PersistenceContext(unitName = "persistenceUnitName")
EntityManager em;
public ThingsResource() { }
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response postThing(ThingDTO thing){
ThingEntity newThing = new ThingEntity(thing);
em.persist(newThing);
em.flush();
return Response.created(new URI("/" + newThing.getId()).build();
}
}