泽西岛是否有可能访问注入的 HttpServletRequest,而不是代理
Is it possible in Jersey to have access to an injected HttpServletRequest, instead of to a proxy
在 Jersey/JAX-RS 资源中注入 HttpServletRequest
时,注入的值是一个代理。例如:
@Path("/myResource")
class MyResource {
@Inject
HttpServletRequest request;
...
}
将为请求的 HttpServletRequest
注入一个 Proxy
对象。我需要访问实际的 HttpServletRequest
实例对象,因为我想使用一些不在代理 HttpServletRequest
接口中的容器特定功能。
jersey 有没有办法通过注入访问实际对象?我知道在旧版本的 Jersey 中,您可以注入一个 ThreadLocal<HttpServletRequest>
来实现这一点。但是 jersey 2.15 似乎不再支持它了。
基本原理:我的代码依赖于 org.eclipse.jetty.server.Request
中实现 HttpRequest
的功能,并为 HTTP/2 推送添加了功能。我想将它与 Jersey/JAX-RS.
一起使用
不要让您的资源 class 成为单例。如果这样做,除了代理别无选择,因为请求在不同的范围内。
@Singleton
@Path("servlet")
public class ServletResource {
@Context
HttpServletRequest request;
@GET
public String getType() {
return request.getClass().getName();
}
}
与@Singleton
C:\>curl http://localhost:8080/api/servlet
com.sun.proxy.$Proxy41
没有@Singleton
C:\>curl http://localhost:8080/api/servlet
org.eclipse.jetty.server.Request
还有其他方法可以让您的 class 成为单例,例如将其注册为实例
您也可以将其作为方法参数注入。单例与否,你会得到实际的实例
@GET
public String getType(@Context HttpServletRequest request) {
return request.getClass().getName();
}
另请参阅
正如 Op 所说
I know that in older versions of Jersey you could inject a ThreadLocal to achieve this.
我只想在这里添加一些代码,可以为那些像我一样仍在使用旧版本球衣的人实现此功能:
@Context ThreadLocal<HttpServletRequest> treq;
为此 link:Thread access to @Context objects?
希望能有所帮助。
在 Jersey/JAX-RS 资源中注入 HttpServletRequest
时,注入的值是一个代理。例如:
@Path("/myResource")
class MyResource {
@Inject
HttpServletRequest request;
...
}
将为请求的 HttpServletRequest
注入一个 Proxy
对象。我需要访问实际的 HttpServletRequest
实例对象,因为我想使用一些不在代理 HttpServletRequest
接口中的容器特定功能。
jersey 有没有办法通过注入访问实际对象?我知道在旧版本的 Jersey 中,您可以注入一个 ThreadLocal<HttpServletRequest>
来实现这一点。但是 jersey 2.15 似乎不再支持它了。
基本原理:我的代码依赖于 org.eclipse.jetty.server.Request
中实现 HttpRequest
的功能,并为 HTTP/2 推送添加了功能。我想将它与 Jersey/JAX-RS.
不要让您的资源 class 成为单例。如果这样做,除了代理别无选择,因为请求在不同的范围内。
@Singleton
@Path("servlet")
public class ServletResource {
@Context
HttpServletRequest request;
@GET
public String getType() {
return request.getClass().getName();
}
}
与@Singleton
C:\>curl http://localhost:8080/api/servlet
com.sun.proxy.$Proxy41
没有@Singleton
C:\>curl http://localhost:8080/api/servlet
org.eclipse.jetty.server.Request
还有其他方法可以让您的 class 成为单例,例如将其注册为实例
您也可以将其作为方法参数注入。单例与否,你会得到实际的实例
@GET
public String getType(@Context HttpServletRequest request) {
return request.getClass().getName();
}
另请参阅
正如 Op 所说
I know that in older versions of Jersey you could inject a ThreadLocal to achieve this.
我只想在这里添加一些代码,可以为那些像我一样仍在使用旧版本球衣的人实现此功能:
@Context ThreadLocal<HttpServletRequest> treq;
为此 link:Thread access to @Context objects? 希望能有所帮助。