泽西岛是否有可能访问注入的 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? 希望能有所帮助。