JAX-RS:无状态、单例、RequestScoped 混淆

Jor*_*rdi 4 java jax-rs cdi

我已经多次看到 JAXRS 资源的几种配置方式。

我的意思是,有时我看到它们被注释为@Singleton, @Stateless, @ApplicationScoped, @RequestScoped, 甚至没有任何注释或同时使用它们。

  • javax.enterprise.context.RequestScoped
  • javax.enterprise.context.ApplicationScoped
  • javax.ejb.Stateless
  • javax.ejb.Singleton
  • javax.inject.Singleton

我应该使用哪个注释?

有什么javax.ejb用JAXRS资源呢?

另一方面,我也想知道如何准确地使用@Context注释。

我的意思是,我已经看到这应用于参数,也在类字段中

@Path("entity")
public class EntityResource {

    @Context
    private Request request;

    @POST
    public Response create(Entity entity) {
        this.request...
    }

}
Run Code Online (Sandbox Code Playgroud)

或者,

@Path("entity")
public class EntityResource {

    @POST
    public Response create(Entity entity, @Context Request request) {
        request...
    }

}
Run Code Online (Sandbox Code Playgroud)

我将如何进行?

Har*_*ann 7

不需要在 JAX-RS 资源类中使用任何 EJB 或 CDI 注释——除非您想在同一个类中使用 EJB 或 CDI 特性。

如果要将任何 CDI bean 注入资源类,那么资源类本身必须是 CDI bean,因此应该添加范围注解,最好是@javax.enterprise.context.RequestScoped.

如果您使用像 一样的 EJB 注释@Stateless,注入也将起作用,因为 EJB 也是 CDI bean(但不是相反)。但是,无状态 bean 具有不同的生命周期,并且默认情况下是事务性的。

另一方面,如果需要事务,也可以@javax.transaction.Transctional@RequestScoped和结合使用@Path

背景:

对于大多数用途,EJB 有点过时了。它们首先出现,在 JAX-RS 和 CDI 之前,但如今,CDI 被视为 Java EE/Jakarta EE 中统一的依赖注入机制,并且正在更新旧规范以与 CDI 更紧密地集成。

  • 因为每个 JAX-RS 资源方法调用对应一个 HTTP 请求。如果您使用寿命更长的范围,则您的类必须是线程安全的。 (4认同)