gpt4 book ai didi

java - Jersey 是否有可能访问注入(inject)的 HttpServletRequest,而不是代理

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:10 31 4
gpt4 key购买 nike

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

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

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

jersey 有没有办法通过注入(inject)访问实际对象?我知道在旧版本的 Jersey 你可以注入(inject) ThreadLocal<HttpServletRequest>为了达成这个。但是 jersey 2.15 似乎不再支持它。

基本原理:我的代码依赖于 org.eclipse.jetty.server.Request 中的功能实现HttpRequest ,并添加了 HTTP/2 推送功能。我想将它与 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

还有其他方法可以让你的类成为单例,比如将它注册为一个实例

您也可以将其作为方法参数注入(inject)。单例与否,你会得到实际的实例

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

另见

关于java - Jersey 是否有可能访问注入(inject)的 HttpServletRequest,而不是代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29434312/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com