Tomcat部署JAX-RS默认Application类失效问题求助
问题原因与解决方案
核心原因
jakarta.ws.rs.core.Application是抽象类,不能直接作为Servlet类配置到web.xml中。Jakarta RESTful WS仅为规范定义,本身不提供Servlet容器的实现,必须依赖具体的JAX-RS实现(如Jersey、RESTEasy)来提供可实例化的Servlet类。
具体解决方案
1. 添加JAX-RS实现依赖
根据你选择的实现,在pom.xml中添加对应的依赖(注意:不能设为provided scope,除非你部署的应用服务器自带该实现):
示例:Jersey实现
<dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>3.1.5</version> </dependency> <!-- 用于自动扫描资源类和过滤器 --> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> <version>3.1.5</version> </dependency>
示例:RESTEasy实现
<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>6.2.7.Final</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-servlet-initializer</artifactId> <version>6.2.7.Final</version> </dependency>
2. 修改web.xml的Servlet配置
将原来指向jakarta.ws.rs.core.Application的Servlet类替换为对应实现的具体Servlet类,并添加自动扫描配置:
Jersey配置示例
<servlet> <servlet-name>Jakarta REST Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <!-- 指定资源和过滤器所在的包,实现自动扫描 --> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.yourpackage.resources,com.yourpackage.filters</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jakarta REST Application</servlet-name> <url-pattern>/test/*</url-pattern> <!-- 匹配你的@Path路径 --> </servlet-mapping>
RESTEasy配置示例
<servlet> <servlet-name>Jakarta REST Application</servlet-name> <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> <!-- 开启自动扫描 --> <init-param> <param-name>resteasy.scan</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jakarta REST Application</servlet-name> <url-pattern>/test/*</url-pattern> </servlet-mapping>
3. 验证容器版本兼容性
如果使用Tomcat作为容器,需确保版本为10.1+,因为Jakarta Servlet 6.0(对应你的jakarta.servlet-api 6.0.0)需要Tomcat 10.1及以上版本支持。
4. 额外检查
- 确认所有javax相关的依赖已完全替换为jakarta命名空间,避免混合使用导致冲突。
- 若使用自定义
Application子类,可直接指定该类为Servlet类,无需配置扫描参数,但仍需依赖JAX-RS实现。
内容的提问来源于stack exchange,提问作者Adrien1106
相关产品推荐
相关产品推荐

