Jac*_*ack 5 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
}
}
Run Code Online (Sandbox Code Playgroud)
NullPointerException当方法执行时,我得到了,尽管在调试角度我注意到request它并不是真正的null,而是org.apache.openejb.rest.ThreadLocalHttpServletRequest. 当我将@Context注入移至方法参数级别时,一切正常:
public String addSomething(@FormParam("something") final String something,
@Context final HttpServletRequest request) { ... }
Run Code Online (Sandbox Code Playgroud)
这是什么原因呢?据我记得,在我将服务设为 EJB 之前它曾经可以工作(我这样做是为了使用@EJB或@Inject可能注入 DAO)。JAX-RS 是否为每个请求创建此类服务的实例,因此能够通过类级别注入@Context?EJB 是否会在 JAX-RS 执行任何操作之前通过创建实例并填充代理对象来防止这种情况发生?
解决一个老问题——
当你将其变成无状态时,它就变成了单例模型,因此注入字段不再是线程安全的。当您将 jax-rs 服务转换为 Spring bean 时,也会发生同样的事情。更安全的方法是您提到的解决方法,并注入方法参数。