JAX_RS资源和EJB生命周期不匹配

时间:2016-11-10 14:46:12

标签: java java-ee jersey ejb jax-rs

JAX-RS资源(使用@Path注释的类)具有每请求的默认生命周期。

现在EJB也有自己的生命周期,我的意思是当引用EJB时​​,这个引用实际上是管理EJB池的代理对象的引用。

当EJB也是JAX-RS资源时,这些生命周期模型如何共存?

https://jersey.java.net/documentation/latest/jaxrs-resources.html

  

默认情况下,JAX-RS资源在每个请求范围内进行管理   表示为每个请求创建新资源。

源: https://jersey.java.net/documentation/latest/jaxrs-resources.html

2 个答案:

答案 0 :(得分:1)

  

JAX-RS与Enterprise JavaBeans技术(企业bean)配合使用   和Java EE的上下文和依赖注入(CDI)。

     

通常,要使JAX-RS与企业bean一起使用,您需要   使用@Path注释bean的类以将其转换为根   资源类。您可以将@Path注释与无状态一起使用   会话bean和单例POJO bean。

     

JAX-RS和CDI的组件模型略有不同。默认情况下,   JAX-RS根资源类在请求范围内进行管理,但不是   指定范围需要注释。 CDI托管bean   可以转换使用@RequestScoped或@ApplicationScoped进行注释   到JAX-RS资源类。

对于使用注入另一个bean类的bean的Web应用程序,bean需要能够在用户与应用程序交互的持续时间内保持状态。定义此状态的方法是为bean提供范围

  • @RequestScoped:用户在单个HTTP请求中与网络应用程序的互动。

  • @SessionScoped:用户跨多个HTTP与Web应用程序的交互 请求。

  • @ApplicationScoped:所有用户与网络应用程序交互的共享状态。

  • @Dependent:默认范围(如果未指定);它意味着一个对象 存在只服务于一个客户端(bean)并具有相同的生命周期 作为客户端(bean)。

  • @ConversationScoped:用户与servlet的交互,包括JavaServer Faces 应用。会话范围存在于 开发人员控制的边界,将其扩展到多个边界 请求长时间对话。所有长期运行 会话的范围限定为特定的HTTP servlet会话 不跨越会话边界。

回答你的问题,正如你可以在另一个内部执行上下文和依赖注入一样,每个bean将独立地管理自己的状态。根据您要执行的角色,您必须为其定义范围。

https://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced004.htm https://docs.oracle.com/javaee/7/tutorial/cdi-basic008.htm#GJBBK

答案 1 :(得分:0)

EJB提供的是每个客户端请求和事务的单个专用线程。 例如,您可以将每个无状态bean视为一个线程实例,该实例用等待提供请求的(注入)数据进行实例化。 当创建bean时,将发生注入,并且在每次方法调用(在您的情况下为REST)之后,将返回池以供重用或销毁。 因此,REST"每个请求的默认生命周期"和SLSB生命周期。