我是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()
方法的问题。
答案 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;