当前位置: 首页 > 面试题库 >

@Stateless vs @RequestScoped

阎雪峰
2023-03-14
问题内容

我正在学习使用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();

    }
}

问题答案:

马蒂亚斯(Matthias)就在现场。

@Stateless带注释的Bean是EJB,默认情况下提供Container-Managed-
Transactions
。如果EJB的客户端不提供新的事务,则CMT将默认创建一个新的事务。

必需的属性
如果客户端在事务中运行并调用企业bean的方法,则该方法在客户端的事务中执行。如果客户端未与事务关联,则容器在运行该html" target="_blank">方法之前启动一个新事务。

Required属性是使用容器管理的事务划分运行的所有企业Bean方法的隐式事务属性。除非您需要覆盖另一个事务属性,否则通常不设置Required属性。因为事务属性是声明性的,所以以后可以轻松更改它们。

在最近关于jax-rs的java-ee-7
教程中,Oracle提供了使用EJB(@Stateless)的示例。

… EJB的@ javax.ejb.Asynchronous批注和@Suspended
AsyncResponse的组合实现了业务逻辑的异步执行,并最终通知了感兴趣的客户端。任何JAX-
RS根资源都可以使用@Stateless或@Singleton注释进行注释,并且实际上可以用作EJB ..

在这种情况下,@
RequestScoped与@Stateless之间的主要区别在于,容器可以合并EJB,并且避免了可能会在每个请求上构造的bean可能需要的一些昂贵的构造/破坏操作。



 类似资料:
  • CDI到达以执行类的构造函数。但是,请求字段未初始化(注入)。 我做错了什么?

  • 我有这些简单的页面: list.xhtml edit.xhtml 这个豆子: 因此,当我单击其中一个“编辑”按钮时,它会导航到“edit.jsf”,显示已填充的输入,但当我单击“更新”按钮时会出现以下错误: 请注意,我知道如何实现@ViewScope接口来管理CRUD操作,但这是一个简单的概念证明,我需要更好地理解JSF生命周期。 所以我希望“testBean”是@RequestScoped 更新

  • 我有一个应用程序,它有一个EJB,它注入了由CDI生成的实体管理器。同一服务器(wildfly 9)/JVM上的另一个应用程序将使用此EJB从实体管理器获取结果。 EJB的第一次调用将返回预期结果。当调用返回时,它生成实体管理器,获取数据并再次处理实体管理器。由于关闭了实体管理器,该EJB的每个后续调用都将抛出一个错误。未对新实体经理进行生产/处置。 这是预期的巴哈维奥吗?我的代码中有错误吗? 这

  • 我有一个JAR文件,其中包含一个请求范围Bean。(一个注释为的类)。 我有另一个Web服务项目(作为WAR文件构建)。上述JAR文件位于WAR文件的文件夹中。 我试图的类到Web服务项目中的一个类中。 我正在得到一个 这两个项目都有JAR文件,WAR文件包含一个空的。我已经研究这个问题好几天了。请帮忙。 谢谢

  • 用户实体类: 用于访问数据库的外观类: 用户注入的资源类: 和泽西处理程序: 现在的问题是: 当我想访问用户时。站点列表,我得到了延迟加载异常。但很明显,因为User是由RequestScoped提供程序注入的,所以它应该使用相同的EntityManager会话刷新每个请求。正当 我是否可以将每个rest请求的用户实体注入到Rest处理程序类中?

  • 我使用CDI注释定义了一个RequestScoped bean,如下所示。我有几个页面使用同一个bean。当我从一页导航到另一页时。bean obj保持不变。即使我更改了会话(使用不同的用户登录)。bean对象没有改变。 根据RequestScope定义,bean实例应该为每个新请求重新创建。我错过了什么? 我正在使用JSF/Primefaces。从create输入的值。导航到详细信息后可以看到x

相关阅读

相关文章