当前位置: 首页 > 面试题库 >

如何将Grizzly请求注入Jersey ContainerRequestFilter

夏涵畅
2023-03-14
问题内容

我有灰熊提供的球衣。

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

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为空。我可以将上下文注入到被调用的实际端点中,但这相当粗陋和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望Request在请求的ResponseFilter端获取此对象。

必须有一种简单的方法来执行此操作。到目前为止,我所看到的所有问题/答案都不适用于Grizzly,也无法插入REST端点调用的方法。我不想只因为我想获得IP地址而想办法解决所有数百种在调用中添加此方法的方法!

那么这里的关键是什么?我想念什么?


问题答案:

令您惊讶的是,您甚至还运行了该应用程序,以至于您可以发现该请求为空。每当我尝试运行它时,我都会在启动时遇到异常,说没有请求范围,因此无法注入请求,这正是我所期望的。尽管我无法复制NPE,但我认为此解决方案仍然可以解决您的问题。

因此,它Request是一个请求范围对象,因为它随每个请求而变化。但是过滤器的性质是单例。因此,您需要做的就是懒惰地检索它。为此,我们可以将javax.inject.Provider用作延迟检索机制。

回到我的第一段,这是我刚开始时遇到的例外

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

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

因此,使用Providerdo的目的是让我们尝试Request在存在请求范围时尝试抢占。

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将请求范围对象注入到单例范围对象中


 类似资料:
  • 我试图实现一个< code > ContainerRequestFilter 来检查一些东西。最终,它将从SSL客户机证书中提取通用名称,但我还没有做到这一点。过滤器运行在Grizzly HTTP服务器上(Grizzly 2.3.8,没有servlet容器),位于JAX-RS资源(Jersey 2.6)的前面。 当我尝试将注入过滤器时,它为null。 将请求注入到 JAX-RS 资源中,注入是成功

  • 我试图用jsf和CDI编写一个简单的登录表单。问题是当我注入我的SessionScoped bean时,它不像我期望的那样工作。这是我的豆子 这是我的控制器: 还有一个简单的Jsf表单,它调用login函数并显示LoginInfo类的计数器字段。 通过单击登录按钮和调试变量,我可以看到“lo”是这样的: lo={LoginInfo$Proxy$_$$_WeldClientProxy@16688}“

  • 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 为空。我可以将上下文注入到被调用的实际endpoint中,但这相当粗糙和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端找到这个对象。 必须有一种简单的方法来做到这一点。到目前为止,我看到的所有问题/答案都不适用于灰熊,或者注入了RESTendpoint调

  • 问题内容: 我正在尝试在Spring中建立一个请求范围的bean。 我已经成功设置好了,所以每个请求创建一次bean。现在,它需要访问HttpServletRequest对象。 由于该bean是每个请求创建一次的,所以我认为容器可以轻松地将请求对象注入到我的bean中。我怎样才能做到这一点 ? 问题答案: 可以将请求范围的Bean与请求对象自动连接。

  • 将EntityManager注入资源可以工作,但不能注入Callable。在这里,EntityManager保持。 请告知代码保存在这里是否比保存在GitHub上更好。