You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:04:25