是否有可能在Jersey中访问注入的HttpServletRequest,而不是代理

在Jersey / JAX-RS资源中注入HttpServletRequest时,注入的值是代理。 例如:

 @Path("/myResource") class MyResource { @Inject HttpServletRequest request; ... } 

将为请求的HttpServletRequest注入一个Proxy对象。 我需要访问实际的HttpServletRequest实例对象,因为我想使用一些不在代理HttpServletRequest接口中的容器特定function。

在jersey中有没有办法通过注射进入实际物体? 我知道在旧版本的Jersey中你可以注入ThreadLocal来实现这一点。 但这似乎不再支持jersey2.15了。

基本原理:我的代码依赖于实现HttpRequest org.eclipse.jetty.server.Request中的function,并添加了HTTP / 2推送的function。 我想用Jersey / JAX-RS。

不要让您的资源类成为单例。 如果您这样做,除了代理之外别无选择,因为请求在不同的范围内。

 @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

您的类可以通过其他方式成为单例,例如将其注册为实例

您可以将其作为方法参数注入。 单身或不单身,您将获得实际的实例

 @GET public String getType(@Context HttpServletRequest request) { return request.getClass().getName(); } 

也可以看看

  • 使用HK2和Jersey将请求范围对象注入Singleton Scoped对象