【问题标题】:EJB JAX-RS @Context HttpServletRequest NullPointerException - Why?EJB JAX-RS @Context HttpServletRequest NullPointerException - 为什么?
【发布时间】:2013-04-06 06:41:18
【问题描述】:

考虑以下服务:

@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 可以做任何事情之前创建实例并填充代理对象来防止这种情况发生?

【问题讨论】:

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


    【解决方案1】:

    解决一个老问题 -

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

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 2011-10-26
      • 2017-06-25
      相关资源
      最近更新 更多