【问题标题】:HttpServletResponse with @Context annotation always null带有 @Context 注释的 HttpServletResponse 始终为空
【发布时间】:2018-06-12 15:42:34
【问题描述】:

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

public class SentryFilter {
     @Context
     HttpServletResponse response;

...

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

根据我在 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 is null 错误。

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

【问题讨论】:

  • 哪个服务器?可能是相关的。
  • 不明白你的意思,这是服务器端代码的一部分
  • 您在哪个 Java EE 服务器或独立服务器下运行?我怀疑这种行为可能特定于特定的 JAX-RS 实现/环境。

标签: java rest jax-rs


【解决方案1】:

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

answer 中列出了可用于注入的类型。


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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 不确定 HTTPServletRequest 和 HTTPServletResponse 被“调用”是什么意思。 @Context 不应该填充它们吗?
    • 我的过滤器扩展了一个超类,它扩展了 ContainerRequestFilter 和 ContainerResponseFilter
    【解决方案3】:

    正如@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;

    【讨论】:

      猜你喜欢
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      相关资源
      最近更新 更多