gpt4 book ai didi

java - @Stateless 与 @RequestScoped

转载 作者:IT老高 更新时间:2023-10-28 21:01:38 25 4
gpt4 key购买 nike

我正在学习使用 JAX-RS 进行一些 Restful api 开发,但我的资源类存在问题。

我的理解是我的资源类应该是 RequestScoped,但是,当它是 RequestScoped 时,我对实体管理器的持久方法的调用会引发 TransactionRequiredException。

如果我将我的资源类更改为无状态,那么一切都很好,实体管理器可以毫无问题地持续存在。

我还是 JavaEE 的新手,想知道为什么会发生这种情况,以及 @Stateless 注释的作用是什么使持久性上下文能够正确注入(inject)。我还想知道 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();

}
}

最佳答案

马蒂亚斯是正确的。

@Stateless 注释 bean 是一个 EJB,默认提供 Container-Managed-Transactions .如果 EJB 的客户端没有提供,CMT 默认会创建一个新事务。

Required Attribute If the client is running within a transaction and invokes the enterprise bean’s method, the method executes within the client’s transaction. If the client is not associated with a transaction, the container starts a new transaction before running the method.

The Required attribute is the implicit transaction attribute for all enterprise bean methods running with container-managed transaction demarcation. You typically do not set the Required attribute unless you need to override another transaction attribute. Because transaction attributes are declarative, you can easily change them later.

在最近的java-ee-7 tuturial在 jax-rs 上,Oracle 有使用 EJB (@Stateless) 的示例。

... the combination of EJB's @javax.ejb.Asynchronous annotation and the @Suspended AsyncResponse enables asynchronous execution of business logic with eventual notification of the interested client. Any JAX-RS root resource can be annotated with @Stateless or @Singleton annotations and can, in effect, function as an EJB ..

在这种情况下,@RequestScoped 与 @Stateless 之间的主要区别在于容器可以将 EJB 池化并避免一些昂贵的构造/销毁操作,这些操作可能需要在每个请求上构造的 bean 上进行。

关于java - @Stateless 与 @RequestScoped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20558125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com