dependency-injection - EJB JAX-RS @Context HttpServletRequest NullPointerException - 为什么?

标签 dependency-injection ejb jax-rs resteasy apache-tomee

考虑以下服务:

@Path("/")
@Stateless
public class SomethingService {

    @Context
    final HttpServletRequest request

    @POST
    @Path("post/something/")
    @Produces("application/json; charset=UTF-8")
    public String addSomething(@FormParam("something") final String something) {
        // access to request methods results in NullPointerException
    }
}

我得到一个 NullPointerException当方法执行时,虽然在调试的角度我注意到 request不是真的null而是 org.apache.openejb.rest.ThreadLocalHttpServletRequest 的一个实例.当我移动 @Context注入(inject)到方法参数级别,一切正常:
public String addSomething(@FormParam("something") final String something,
    @Context final HttpServletRequest request) { ... }

这是什么原因?据我所知,在我将服务设为 EJB 之前,它曾经可以工作(我这样做是为了使用 @EJB@Inject 进行 DAO 注入(inject))。 JAX-RS 是否为每个请求创建此类服务的实例,因此能够通过类级别注入(inject) @Context ? EJB 是否通过在 JAX-RS 可以做任何事情之前创建实例并填充代理对象来防止这种情况?

最佳答案

解决一个老问题-

当你把它变成无状态时,它变成了一个单例模型,所以注入(inject)字段不再是线程安全的。当您将 jax-rs 服务转换为 Spring bean 时,也会发生同样的事情。更安全的方法是您提到的解决方法,并注入(inject)方法参数。

关于dependency-injection - EJB JAX-RS @Context HttpServletRequest NullPointerException - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15847925/

相关文章:

java - 如何在不同的资源中重用REST方法?

java - JAX-RS 混合 @FormParam 和 MultivaluedMap<String, String> formParams

python - 什么是依赖注入(inject)的 Pythonic 方式?

java - Spring bean 接线

architecture - DIP vs. DI vs. IoC

java - EJB 依赖于另一个 EJB?

java - 如何从 JAR 中调用 EAR 中的 jar 文件库

java - 有没有类似spring的android应用框架?

java - EJB 2 无状态 session Bean 中的 Spring session 范围 bean

jax-rs - jax-rs 用例中的 StreamingOutput?