考虑以下服务:
@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/