无描述符 Jersey Servlet 容器在 Servlet 3.x 容器中作为过滤器运行

2023-12-22

有没有办法运行 Jersey servlet 容器(2.x)无描述符作为javax.servlet.Filter在 Servlet 3.x 容器中?我需要与我的服务一起提供静态资源,因此需要使用jersey.config.servlet.filter.forwardOn404 or jersey.config.servlet.filter.staticContentRegex仅当根据 Javadoc 作为过滤器运行时才起作用

该属性仅当 Jersey servlet 容器配置为作为 javax.servlet.Filter 运行时才适用,否则该属性将被忽略。

我想摆脱web.xml完全地

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
            http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">
    <display-name>My-Webservice</display-name>

    <filter>
        <filter-name>Jersey Filter</filter-name>
        <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.foo.webservices.MyApplication</param-value>
        </init-param>
    </filter>
</web-app>

一切都按照我的习惯Applicationclass

@ApplicationPath(value = "/")
public class MyApplication extends ResourceConfig
{    
    public MyApplication()
    {
        packages("com.foo.webservices.services");
        property(ServletProperties.FILTER_FORWARD_ON_404, true);
    }
}

官方文档(https://jersey.java.net/documentation/latest/deployment.html#deployment.servlet.3 https://jersey.java.net/documentation/latest/deployment.html#deployment.servlet.3)不幸的是,没有说明任何有关过滤器的内容。


It's possible,但不会像设置一些配置属性那么简单。如果您了解一点它的实际工作原理,将会有所帮助。在 Servlet 3.x 中,引入了ServletContainerInitializer我们可以实现动态加载 servlet(这将进一步讨论here https://stackoverflow.com/a/29730471/2587435)。 Jersey 有一个它使用的实现。但它遵循 JAX-RS,其中规定应用程序应作为 servlet 加载。所以泽西岛没有提供任何解决这个问题的方法。

我们可以自己写ServletContainerInitializer或者我们可以直接进入泽西岛。泽西岛有一个SerletContainerProvider我们可以实施。我们需要自己注册 servlet 过滤器。实现看起来像这样

@Override
public void preInit(ServletContext context, Set<Class<?>> classes) throws ServletException {
    final Class<? extends Application> applicationCls = getApplicationClass(classes);
    if (applicationCls != null) {
        final ApplicationPath appPath = applicationCls.getAnnotation(ApplicationPath.class);
        if (appPath == null) {
            LOGGER.warning("Application class is not annotated with ApplicationPath");
            return;
        }
        final String mapping = createMappingPath(appPath);
        addFilter(context, applicationCls, classes, mapping);
        // to stop Jersey servlet initializer from trying to register another servlet
        classes.remove(applicationCls);
    }
}

private static void addFilter(ServletContext context, Class<? extends Application> cls,
                              Set<Class<?>> classes, String mapping) {
    final ResourceConfig resourceConfig = ResourceConfig.forApplicationClass(cls, classes);
    final ServletContainer filter = new ServletContainer(resourceConfig);
    final FilterRegistration.Dynamic registration = context.addFilter(cls.getName(), filter);
    registration.addMappingForUrlPatterns(null, true, mapping);
    registration.setAsyncSupported(true);
}

一旦我们实现了,我们需要创建一个文件

META-INF/services/org.glassfish.jersey.servlet.internal.spi.ServletContainerProvider

它应该位于类路径的根部。该文件的内容应该是我们实现的完全限定名称。

您可以在此处查看完整的示例GitHub 存储库 https://github.com/psamsotha/jersey-web-initializer

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

无描述符 Jersey Servlet 容器在 Servlet 3.x 容器中作为过滤器运行 的相关文章

  • Mongo 可审核的 ZonedDateTime 字段在 Spring Boot 2 中不起作用

    在 Spring Boot 项目中 我使用 CreatedDate 之类的注释来保存有关创建 更新相应文档的日期的信息 整个项目都使用 ZonedDateTime 因此带注释的字段也是 ZonedDateTime 为了实现 Mongo 的日
  • Java 字符串哈希码缓存

    字符串不变性的优点之一是哈希码缓存以实现更快的访问 在这种情况下 如何处理具有相同哈希码的字符串的缓存 在这种情况下它真的能提高性能吗 在这种情况下 如何处理具有相同哈希码的字符串的缓存 被缓存的是字符串的哈希码 它被缓存在私有的int字符
  • jvm中本机代码如何转换为机器代码[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我读过一些文章说 jvm将字节码转换为机器码 jvm将字节码转换为本机代码 jvm 将字节码转换为系统调用 系统调用又由操作系统与硬件
  • jpa2 CriteriaBuilder order by “ORDER BY 表达式必须出现在选择列表中”

    我正在写一个查询标准生成器 但无法添加order by子句 因为它随消息一起抛出错误ORDER BY 表达式必须出现在选择列表中这是我的实体 public class A Integer aId ManyToOne JoinColumn n
  • Glassfish:在部署期间修改 EAR 的部署描述符

    经过几天的搜索 尝试和摇头 我将这个问题发布到 SO 尽管它seems已经得到答复 这是场景 我有一个 EAR 应用程序 目前 包含一个 WAR 和一个 EJB 模块 EJB 模块使用 JPA persistence xml 并且一些无状态
  • Java Spark DataFrameReader java.lang.NegativeArraySizeException

    学习 Spark for java 并尝试阅读 csv文件为DataFrame使用DataFrameReader 甚至不能得到一个超级简单的 csv文件工作 因为我不断收到异常java lang NegativeArraySizeExcep
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • AffineTransform.rotate() - 如何同时缩放、旋转和缩放?

    我有以下代码 它可以完成我想要绘制一个上面有一些棋子的棋盘的 第一部分 Image pieceImage getImage currentPiece int pieceHeight pieceImage getHeight null dou
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • net.sf.jasperreports.engine.JRRuntimeException:java.io.IOException:无法读取字体数据

    我正在尝试通过 JasperReport 创建 PDF 报告 但读取字体数据时出现问题 我有 jasperreports extension properties 和 ClassPath 中的相关 TTF 文件 这是错误 java io I
  • Java 中的 MP4 容器编写器

    我想找到一个免费的 Java MP4 容器 编写器 我不需要编码器 只需要能够根据预期值写入正确原子的编码器 Bonus对于这样一个库 也可以编写 有效 F4V 我更喜欢纯 Java 解决方案 而不是使用 JNI 或外部可执行文件的解决方案
  • org.apache.commons.codec.digest.Md5Crypt.md5Crypt 函数。 linux下出现异常,windows下正常

    我们正在使用commons codec加密密码 使用org apache commons codec digest Md5Crypt md5Crypt功能 在Windows环境下工作正常 但在CentOS上却抛出异常 我们有3台centOS
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • 在 REST Web 服务中接受逗号分隔值

    我正在尝试接收 REST URI 中以逗号分隔值形式的字符串列表 示例 http localhost 8080 com vogella jersey first rest todo test 1 abc test 其中 abc 和 test
  • 更新分页。是否可以?

    他们是否存在一些方法来处理更新分页 例如我有 100 行类型 Id private Integer id Column private boolean flag Column private Date last 一开始它们看起来像 id f
  • AndroidAnnotations 和 Dagger

    我正在尝试使用 Dagger 注入 Android 带注释的 Activity java lang IllegalArgumentException No inject registered for members com app serv
  • 使用 PDFBox 在 Android 中创建 PDF

    我正在尝试通过我的 Android 应用程序创建 PDFPDFBoxapi 但出现以下错误 java lang NoClassDefFoundError org apache pdfbox pdmodel PDDocument 我已经将以下

随机推荐

  • 获取新的 Apple 设备令牌?

    我正在创建一个应用程序 允许用户注销该应用程序并根据需要以其他用户身份登录 新用户登录后 有什么方法可以从 Apple 获取新的设备令牌吗 有没有办法强制调用didRegisterForRemoteNotificationsWithDevi
  • 确定网络连接带宽(速度)wifi和移动数据

    我想要获取以 kbps 或 mbps 为单位的网络连接带宽 如果设备连接到 WiFi 那么它应该返回网络带宽 速度 以及移动数据 它将返回 wifi 能力速率 但我想要精确的数据传输速率 public String getLinkRate
  • 更改 recyclerView 项目背景 onClick?

    当我按下我的按钮时我就会做到这一点recyclerView这会改变它的背景颜色 这样按下的时候就会可见 但我不太喜欢android 所以我不知道该怎么做 我尝试过在网上找到的一些指南 但其中大多数对我不起作用 就像这样guide https
  • 如何使用 nunit 和 moq 进行异常处理?

    我正在尝试使用 nunits 新的异常处理方式 但我发现很难找到有关它的信息以及如何将它与最小起订量一起使用 我现在有最小起订量 它在模拟方法上抛出异常 但我不知道如何使用 nunit 来捕获它并查看它 有几种不同的方法可以做到这一点 我使
  • `with_items` 输出太冗长

    我编写了一个 ansible 任务来迭代设置列表 使用with items 现在 当我运行 ansible 时 我的所有设置都会被记录 它非常冗长 让人很难看出发生了什么 但是 如果我禁用所有输出no log 当特定项目失败时 我将无法识别
  • 使用 React 构建 CRM Web 资源

    我是新的 Dynamics CRM 我的项目包括表单提交和验证 我计划使用带有 Redux 前端的 React 和 CRM 的服务来构建一个产品 构建 CRM Web 资源的 CRM 最佳实践是什么 有人可以指导我吗 https githu
  • 如何使用 Flask 和 Celery 定期运行函数?

    我有一个烧瓶应用程序 大致如下所示 app Flask name app route methods POST def foo data json loads request data do some stuff return OK 现在另
  • 自定义龙目岛超级构建器

    我有一个父抽象类 Parent 和子类 Child 我正在使用 SuperBuilder 生成构建器 API 现在 我想对 Parent 和 Child 类的成员执行一些验证 作为构建的一部分 我找不到任何解决方案来自定义龙目岛超级构建器
  • 使用 C API 创建自定义类对象的 numpy 数组

    使用 C API 我想创建一个包含类型对象的 numpy 数组Quaternion 这是我用 C 编写的一个类 我已经有一个数组 实际上是一个std vector 并且我想制作一个副本 或者如果可能的话使用相同的内存 由于这不是基本类型 我
  • 在底部导航视图中不设置预先选择的项目

    我正在将材料设计库中的新底部导航视图添加到项目中 并且我希望默认情况下没有预先选择的项目 目前默认选择第一项 我用过 mBottomNavigation getMenu getItem 0 setChecked false 但是当在 for
  • 使用 CUDA 向量类型有优势吗?

    CUDA 提供内置矢量数据类型 例如uint2 uint4等等 使用这些数据类型有什么优点吗 假设我有一个由两个值 A 和 B 组成的元组 将它们存储在内存中的一种方法是分配两个数组 第一个数组存储所有 A 值 第二个数组存储与 A 值对应
  • Fluent NHibernate 映射 CompositeId 并使用 SetProjection 进行查询

    我有两个表 Section 和SectionList 它们通过多对多表 Membership 相关 由于多对多表中有一个额外的属性 我必须将其分解为自己的实体 public MembershipMap UseCompositeId With
  • 目标需要语言方言“CXX17”(带有编译器扩展),但 CMake 不知道用于启用它的编译标志

    所以我一直在尝试包括
  • 太阳黑子地理空间搜索错误:未知字段“location_ll”

    几天来我一直在尝试将地理空间搜索集成到我的 Rails 应用程序中 但是当我运行 rake sunspot solr reindex 时不断收到此错误 RSolr Error Http 400 Bad Request Error ERROR
  • Facebook 登录:“应用程序已禁用 Facebook 集成的 Oauth 客户端流程”

    我正在将 Facebook 登录与我的 Android 应用程序集成 当我登录时 它会向我显示消息 您的应用程序已禁用 Oauth 客户端流程 我的代码是这样的 package com example jiffy import java u
  • Python 请求 api 未获取表体内的数据

    我正在尝试废弃一个网页 以从请求响应返回的文本数据中获取表值 tbody class stats tbody tbody class annotation tbody 实际上里面有一些数据tbody类 但 我无法使用请求访问该数据 这是我的
  • 您会推荐哪种图标编辑软件来为应用程序创建图标[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我曾经购买过一个许可证米克安吉洛 http www microangelo us 用于创建过去对我很有
  • 旧系统版本上的标签不会更新 - xamarin

    我有问题 旧版本上的标签不会更新 在 Android 系统版本 8 1 上一切正常 但例如在 7 1 版本上刷新标签不起作用 private void OnTimedEvent object sender System Timers Ela
  • Mongoose - 保存字符串数组

    我无法使用以下命令将字符串数组保存到我的数据库中Mongoose 请注意 为了便于此处编写 下面的所有代码都经过简化 所以我声明了一个个人模式的变量 var newPerson new Person tags req body tags 架
  • 无描述符 Jersey Servlet 容器在 Servlet 3.x 容器中作为过滤器运行

    有没有办法运行 Jersey servlet 容器 2 x 无描述符作为javax servlet Filter在 Servlet 3 x 容器中 我需要与我的服务一起提供静态资源 因此需要使用jersey config servlet f