Jersey:ContainerRequestFilter 未获取 Context ServletRequest

2023-12-24

要查看此问题的完整代码,请参阅此 github

https://github.com/mobiusinversion/web-application https://github.com/mobiusinversion/web-application

我还创建了这个 Jersey Jira

https://java.net/jira/browse/JERSEY-2851 https://java.net/jira/browse/JERSEY-2851

我正在研究一个ContainerRequestFilter使用泽西岛 2.15。这是一个嵌入式 Jetty 应用程序,被隐藏在一个 jar 中。

在 Jetty 启动器(主类)中:

public static void main(String[] args) throws Exception {
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/");
    Server jettyServer = new Server(10005);
    jettyServer.setHandler(context);
    ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/*");
    jerseyServlet.setInitOrder(0);
    jerseyServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, ServletConstants.COMPONENT_SCAN_ROOT);

    try {
        System.out.println("Starting Jetty");
        jettyServer.start();
        System.out.println("Jetty Started");
        jettyServer.join();
    } catch (Exception e) {
        System.out.println("Could not start server");
        e.printStackTrace();
    } finally {
        jettyServer.destroy();
    }
}

我有一个通过提供商提供的过滤器

@Provider
public class ExampleProvider implements DynamicFeature {

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext featureContext) {
        ExampleFilter exampleFilter = new ExampleFilter();
        featureContext.register(exampleFilter);
    }
}

然后在过滤器中:

public class ExampleFilter implements ContainerRequestFilter {

    private static final Logger logger = LoggerFactory.getLogger(ExampleFilter.class);

    @Context
    private HttpServletRequest servletRequest;

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException {
        logger.info("IP ADDRESS " + servletRequest.getRemoteAddr());
        // ...
    }

}

然而这会产生一个NullPointerException:

Caused by: java.lang.NullPointerException: null
at com.example.filters.ExampleFilter.filter(ExampleFilter.java:29) 
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:131) 
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:67) 

我做错了什么以及如何解决这个问题?

更新:包括 Jetty 和 Jersey 的 pom 条目

    <properties>
        <jersey.version>2.15</jersey.version>
        <jetty.version>9.2.6.v20141205</jetty.version>
    </properties>

    <!-- Jersey -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey</groupId>
        <artifactId>jersey-bom</artifactId>
        <version>${jersey.version}</version>
        <type>pom</type>
        <scope>compile</scope>
    </dependency>

    <!-- Jetty -->
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>${jetty.version}</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
        <version>${jetty.version}</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlets</artifactId>
        <version>${jetty.version}</version>
    </dependency>

错误在于你手动创建的一个实例ExampleRequestLoggingFilter在 - 的里面ExampleRequestFilterProvider。依赖注入仅适用于容器本身创建和管理的实例,例如ExampleRequestFilterProvider。这解释了为什么@Context注入似乎在您手动创建的实例中不起作用。

解决方案是将注入点移至ExampleRequestFilterProvider然后将其传递给构造函数ExampleRequestLoggingFilter.

@Provider
public class ExampleRequestFilterProvider implements DynamicFeature {

    @Context
    private HttpServletRequest request;

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext featureContext) {
        ExampleRequestLoggingFilter exampleRequestLoggingFilter = new ExampleRequestLoggingFilter(request);
        featureContext.register(exampleRequestLoggingFilter);
    }

}

我在这里测试了它(感谢 Git 项目!)并且它对我有用。

请注意,您在这里并没有传递实际的HttpServletRequest实例,而是一个容器管理的代理,它在每个方法调用上进一步委托给实际实例,因此这里无需担心完整性和线程安全性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jersey:ContainerRequestFilter 未获取 Context ServletRequest 的相关文章

  • HTTP 状态 404 - 请求的资源不可用

    在使用 MyEclipse IDE 中的 Tomcat 服务器和 Struts 2 框架时 我遇到了反复出现的问题 我将我的程序作为服务器应用程序运行 当它运行时 默认的index jsp 文件将成功打开 但应用程序的其他过去都不起作用 当
  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮

随机推荐

  • 绑定值源已删除

    由于某种原因 在使用状态 带有数组 并与其值之一绑定时出现索引越界错误 一般来说 向数组添加更多值是没有问题的 但是 当您尝试删除一个值时 您会收到索引越界错误 这是我在自己的项目中遇到的问题的简化版本 在 SwiftUI 中尝试以下示例
  • 开发基于 Java EE 的 Web 应用程序时如何提高生产力

    我想知道与其他技术堆栈相比 您如何解决基于 Java EE 的 Web 应用程序开发看似低生产率的问题 Seaside http www seaside st 红宝石 on Rails http rubyonrails org etc 限制
  • 在带有模拟器的 Xamarin.iOS 中使用 Azure AD B2C - 钥匙串问题(团队 ID 为空)

    我正在开发 Xamarin Forms 应用程序 并设置 Azure AD B2C 进行身份验证 我正在关注官方教程 https learn microsoft com en us xamarin xamarin forms data cl
  • 如何在haproxy中启用keep-alive?

    这是我的 haproxy conf haproxy 1 7 9 global log 127 0 0 1 local0 defaults retries 3 option redispatch timeout client 30s time
  • 使用 CASE 语句根据在 PARTITION 中查找特定条目来更改新 BigQuery 列的值

    我尝试编写一些 case 语句 如果分区内满足特定条件 这些语句可能会更改调用中所有条目的值 这是具体的上下文 假设我有一个使用以下 SQL 查询创建的特定数据集 SELECT date CONCAT fullVisitorId STRIN
  • 如何对包含 erf 函数的 SymPy 表达式进行羔羊化处理以与 NumPy 一起使用

    我想用 SymPy 对包含 erf 函数的符号表达式进行羔羊化 对于标量参数可以按如下方式完成此操作 log normal 0 5 0 5 sym erf sym log x mu sym sqrt 2 sigma 2 F sym lamb
  • Python Exchangelib:检查项目是否是消息

    使用 Exchangelib 检索项目时出现错误 有没有什么方法可以检测该项目是否是电子邮件 如果不是 则忽略它 下面的代码引发AttributeError MeetingRequest object has no attribute fl
  • 尝试在 Web 视图中显示 url

    我正在尝试使用loopj包 我正在尝试向网站发出 HTTP 请求并在 web 视图中显示该网站 我成功返回结果 但是 Web 视图没有按需要显示页面 而是 chrome 打开并显示页面 我是否遗漏了某些内容 或者有什么方法可以覆盖这种不需要
  • Chrome 命令行开关/参数是什么?

    在哪里可以找到用于 Chrome 和 chromedriver 的命令行开关列表 对于 Chromium 请在此处找到列表 https chromium googlesource com chromium src master chrome
  • 如何使用 purrr 中的映射和 dplyr 中的 mutate 来生成 glm 汇总表?

    我正在使用 purrr 和 broom 包来生成一系列 glm 并构建一个包含模型信息的表 以便我可以对它们进行比较 当我从 purrr 调用地图函数时 代码失败 我认为问题与 mutate 和 map 的组合有关 我想生成一个表 其中每个
  • 如何更改asp.net web api中的默认路由

    我正在研究 asp net web api 我正在尝试在 global asax 文件中设置项目的默认路由 例如 localhost 45678 api Products 但我没有找到任何类似于 asp net mvc 路由模型的格式 ur
  • 秒到年

    基本上 我正在尝试重新创建 PHP 日期的年份功能 使用自 1970 年 1 月 1 日以来的秒数 我试图在不使用内置函数的情况下获取年份 我有一个想法 但由于闰年而没有实现 谁能给我一个可行的公式 从 1970 年开始计算秒数并计算出一年
  • 为什么番石榴在我的 build.sbt 中没有正确着色?

    tl dr Here https github com erip shading repro lagom hdfs是包含问题的存储库 Cassandra 和 HDFS 都在内部使用 guava 但由于各种原因 它们都没有屏蔽依赖关系 因为番
  • Cocoa - 从 NSOperation 返回信息

    我有一个 iPhone 应用程序 它使用 Web 服务从服务器获取数据 我将对 Web 服务的每个调用都放在 NSOperation 子类中 以便它可以线程化 我的问题是 从已完成的 NSOperation 子类传回信息的推荐方法是什么 我
  • 同步块内的产量?调用yield()后锁释放?

    我正在创建一个多线程并调用yield 在里面 java lang Thread yield 方法使当前正在执行的线程对象暂时暂停并允许其他线程执行 其他线程是否有可能执行也想进入同步块的情况 synchronized this lock c
  • 是否有 std::noncopyable (或等效的)?

    有一个提升 不可复制 http www boost org doc libs master libs core doc html core noncopyable html我的图书馆里有我自己的不可复制的课程 最新的 C 标准中是否有 st
  • ServiceTestCase 中的 MockContentResolver 空指针

    我正在尝试以 TDD 式的方式创建一个服务 为此我创建了以下测试 该服务主要轮询 Web 服务并将新信息放入内容提供程序中 由于它是一项服务 因此我使用内容提供程序 它将将信息存储到其中作为测试的预言机 我认为我想要做的是创建一个 Mock
  • Swift iOS8 如何删除最后一张照片?

    我尝试从相机胶卷中获取最后一张照片并将其删除 现在我获取了最后一张照片 但在删除最后一张照片时遇到问题 我尝试了这种方法 但我删除了所有照片 所以我计划构建一个新的 PHFetchResult 其中仅包含最后一张照片 但我不知道该怎么做 P
  • 有向图的数据结构,允许快速删除节点?

    我需要存储有向图 不一定是非循环的 以便节点删除尽可能快 我不介意存储额外的数据 以便准确地知道删除节点时必须删除哪些边 如果我存储一个边列表 作为节点索引对 那么当杀死某个节点 n 时 我必须在整个列表中搜索源或目标为 n 的边 这对于我
  • Jersey:ContainerRequestFilter 未获取 Context ServletRequest

    要查看此问题的完整代码 请参阅此 github https github com mobiusinversion web application https github com mobiusinversion web applicatio