带有@Context注释的HttpServletResponse始终为null

时间:2018-01-02 23:42:30

标签: java rest jax-rs

我是JAX-RS的新手,我正在努力了解@Context注释是如何工作的。我有一个REST服务,目前正在使用某些过滤器对不同的请求类型进行额外处理。其中一个过滤器内部是以下行:

public class SentryFilter {
     @Context
     HttpServletResponse response;

...

稍后将在该过滤器的filter()方法中使用此值。问题是响应对象为null。我已经通过调试器,无法确定为什么它是null。

从我在JAX-RS文档中读到的内容,HttpServletResponse的@Context注释可以由资源方法填充。所以,我修改了我正在调用的API,包括HttpServletResponse

public interface APIStuff {
    @Path("deviceName")
        @GET
        @Sentry
        String getDeviceName(@PathParam("deviceId") @Size(min = 1, max = 1024) final String deviceId, @Context HttpServletResponse httpServletResponse);

    ...

这返回相同的HttpServletResponse为null错误。

所以问题是,这个值应该被“填充”在哪里?编写过滤器类的人显然这样做,认为response对象将被填充,所以我认为这不是将@Context HttpServletResponse传递给filter()方法的问题。

3 个答案:

答案 0 :(得分:1)

@Context注释允许您将请求/响应上下文详细信息注入JAX-RS提供程序和资源类。可以在类字段,bean属性或方法参数中执行注入。

可用于注射的类型列在此answer中。

您尚未提供有关 部署应用程序的任何详细信息,但请注意,部署应用程序时,HttpServletResponse仅可用于 在servlet容器中(例如Tomcat)。这可能是你的问题。

答案 1 :(得分:1)

@Context因使用情况而异,取决于实际注入的内容。如果要注入HttpServletResponse,则需要将其作为方法签名的一部分。这是因为大多数bean都是作为单例实现的,如果在实例级别实现,则拥有多个请求只会覆盖响应。

顺便说一下,IMO API应支持将仅限方法的“@Context”资源注入(例如)ThreadLocal<HttpServletResponse>

您发布的Filter未展开javax.servlet.Filter,您是否包含完整签名?这个过滤器是如何使用的?

至于资源方法级别注入为什么会出现null,你确定它实际上是在servlet上下文中调用的吗?

答案 2 :(得分:0)

正如@cassiomolin所说,您尚未提供有关如何部署应用程序的任何详细信息,仅当将应用程序部署在servlet容器(例如Tomcat)中时,HttpServletResponse才可用于注入。这可能是您的问题。

我与GrizzlyHttpServer有类似的问题。 我遇到这个问题的原因是,Grizzly提供了与Servlet规范所提供的相似的抽象:HttpHandler(Servlet),Request(HttpServletRequest),Response(HttpServletResponse)。

所以我不得不使用:import org.glassfish.grizzly.http.server.Request;
而不是:import javax.servlet.http.HttpServletRequest;