gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:20:23 26 4
gpt4 key购买 nike

考虑以下服务:

@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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com