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

Ger*_*rit 6 java rest proxy dependency-injection jersey

当注入HttpServletRequest在Jersey/JAX-RS资源,注入的值是一个代理服务器.例如:

@Path("/myResource") 
class MyResource {
    @Inject 
    HttpServletRequest request;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

在球衣中有没有办法通过注射进入实际物体?我知道在旧版本的泽西岛你可以注入一个ThreadLocal<HttpServletRequest>来达到这个目的.但这似乎不再支持球衣2.15了.

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

Pau*_*tha 7

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

@Singleton
@Path("servlet")
public class ServletResource {

    @Context
    HttpServletRequest request;

    @GET
    public String getType() {
        return request.getClass().getName();
    }
}
Run Code Online (Sandbox Code Playgroud)

@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();
}
Run Code Online (Sandbox Code Playgroud)

也可以看看