当前位置: 首页 > 知识库问答 >
问题:

如何将灰熊请求注入泽西岛容器请求过滤器

宣滨海
2023-03-14

我有灰熊提供的球衣。

我有一个容器请求过滤器实现类。但是,为所有传入请求创建一次此类。因此,这样做:

public class EndpointRequestFilter implements ContainerRequestFilter {
    @Context
    private org.glassfish.grizzly.http.server.Request requestContext;

    public void filter( ContainerRequestContext req ) throws IOException {
       // remove for sake of example
    }
}

requestContext为空。我可以将上下文注入到被调用的实际endpoint中,但这相当粗糙和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端找到这个Request对象。

必须有一种简单的方法来做到这一点。到目前为止,我看到的所有问题/答案都不适用于灰熊,或者注入了RESTendpoint调用的方法。我不希望仅仅因为我想获得IP地址,就绕过我所有的数百种方法在调用中添加它!

那么这里的关键是什么?我错过了什么?

共有1个答案

闾丘树
2023-03-14

我很惊讶你竟然让应用程序运行起来,以至于你可以发现请求为空。每当我尝试运行它时,我都会在启动时收到一个异常,说没有请求范围,因此无法注入请求,这正是我所期望的。虽然我无法复制NPE,但我认为此解决方案仍能解决您的问题。

因此< code>Request是一个请求范围的对象,因为它在每次请求时都会改变。但是过滤器本质上是单一的。所以你需要做的,是懒洋洋地取回它。为此,我们可以使用< code > javax . inject . provider 作为一种惰性检索机制。

回到我第一段的观点,这是我在启动时得到的例外。

java.lang.IllegalStateException:不在请求范围内。

这是有道理的,因为请求需要与请求范围相关联,而在启动时,没有。请求范围仅在请求期间存在。

因此,使用Provider所做的是,当存在请求作用域时,允许我们尝试获取请求

public static class Filter implements ContainerRequestFilter {

    @Context
    private javax.inject.Provider<Request> requestProvider;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        final Request request = requestProvider.get();
        System.out.println(request.getRemoteAddr());
    } 
}

我已经对此进行了测试,它按预期工作。

另请参见:

  • 使用HK2和Jersey将请求作用域对象注入单个作用域对象
 类似资料:
  • 在Jersey 1.x中,我们从一个(Jersey)会话属性访问Wicket会话,如这里https://stackoverflow.com/a/15767824/1399659.所述 在迁移到Jersey 2.x时,使用ContainerRequestFilter似乎是合适的模式,它还允许Springbean注入。我们通过包括 作为 Servlet 容器的初始化参数,并在容器请求筛选实现上使用@P

  • 这件事已经做了几个小时了,似乎什么也做不成。它是Jersey 2.23.2。我想将一个基于请求的Hibernate会话注入Jersey提供程序,以便在我的REST API中使用。相反,我得到的是: 这是我的代码: 我已经尝试了上百种排列方式。不知疲倦地在网上搜索。因为我一直没有明确地看着这个问题,所以我认为它一定很简单。 当我在 AbstractBinder 配置方法中指定单例而不是请求范围时,我

  • 我不知道为什么我不能为注册用户发布数据,我需要一些其他的东西,比如解析或者....请帮助我,谢谢

  • 我有一个基于令牌的用户身份验证的Jersey REST应用程序。当请求传入时,会创建一个自定义的对象,并将其作为一个属性添加到 的用法,我想知道是否可以使用injection将这个< code>RestContext注入到我的资源和其他过滤器中(例如,我有一个过滤器,它从< code>RestContext中创建一个< code>SecurityContext),但是我找不到答案。一般来说,我如何

  • 问题内容: 我正在尝试编写一个使用Jersey客户端API访问RESTful Web服务的库。该服务需要设置cookie的登录请求,然后后续请求必须将该cookie设置为成功。登录请求按预期方式工作,我能够从登录响应中检索cookie,但似乎无法在后续请求中重新添加cookie。谁能说出我可能做错了什么。这是发出请求的代码: 当请求没有失败时,服务将以应用程序错误“ No Session”进行响应

  • 我试图理解异步响应在Jersey上的工作方式。我阅读了新泽西文档(https://jersey.java.net/documentation/latest/async.html)的第10章,但它对我的问题没有帮助。这里关于stackoverflow的研究也没有得出令人满意的答案(这一点我可以理解)。 我试图做的与本文中的一个问题类似(使用http状态202进行异步操作)。我想使用HTML表单文档将