是否有可能在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对象