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

Dependency injection EJB JAX-RS@Context HttpServletRequest NullPointerException-为什么?,dependency-injection,ejb,jax-rs,resteasy,apache-tomee,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("somet

考虑以下服务:

@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
注入移动到方法参数级别时,一切正常:

public String addSomething(@FormParam("something") final String something,
    @Context final HttpServletRequest request) { ... }

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

回答一个老问题-

当您将其转换为无状态时,它将转换为单例模型,因此注入字段不再是线程安全的。当您将jax-rs服务转换为springbean时,也会发生同样的事情。更安全的方法是您提到的解决方法,并注入方法参数