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

时间:2013-04-06 06:41:18

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

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

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

1 个答案:

答案 0 :(得分:1)

提出一个老问题 -

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