Tomcat10+Jakarta搭建REST接口报错求助
问题分析与解决方案
你的核心问题是混淆了JAX-RS(Jakarta REST)应用入口与Servlet的配置逻辑,且Tomcat本身不内置JAX-RS实现,必须引入第三方实现(如Jersey、RESTEasy)才能正常运行REST服务。以下是分步解决方法:
步骤1:添加JAX-RS实现依赖(以Jersey为例)
Tomcat仅提供Servlet容器,不包含REST服务的处理能力,需手动添加JAX-RS实现依赖。如果使用Maven,在pom.xml中添加:
<dependencies> <!-- Jakarta REST API 核心依赖 --> <dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- Jersey Servlet容器(处理REST请求的核心Servlet) --> <dependency> <groupId>org.glassfish.jersey.servlet</groupId> <artifactId>jersey-servlet-container</artifactId> <version>3.1.5</version> </dependency> <!-- 可选:JSON格式支持 --> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-binding</artifactId> <version>3.1.5</version> </dependency> </dependencies>
若手动管理jar包,需将对应版本的Jersey包下载后放入项目WEB-INF/lib目录。
步骤2:修正web.xml配置
不能直接将jakarta.ws.rs.core.Application或自定义子类配置为Servlet,需使用JAX-RS实现提供的Servlet容器类,并关联你的自定义Application:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0"> <!-- 保留原有Servlet配置 --> <servlet> <servlet-name>cotizacion</servlet-name> <servlet-class>gub.tramitecaj.ServletCotizacion</servlet-class> </servlet> <servlet-mapping> <servlet-name>cotizacion</servlet-name> <url-pattern>/wscotizacion</url-pattern> </servlet-mapping> <!-- JAX-RS服务核心配置 --> <servlet> <servlet-name>RestContainer</servlet-name> <!-- Jersey提供的Servlet容器类 --> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <!-- 指定自定义的Application子类 --> <init-param> <param-name>jakarta.ws.rs.Application</param-name> <param-value>gub.tramitecaj.rest.RestApplication</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>RestContainer</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
步骤3:调整自定义Application类
由于web.xml中已配置URL路径前缀,可移除类上的@ApplicationPath("/rest")注解(若保留,web.xml的配置优先级更高):
package gub.tramitecaj.rest; import java.util.HashSet; import java.util.Set; import jakarta.ws.rs.core.Application; public class RestApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); classes.add(gub.tramitecaj.ws.Cotizacion.class); return classes; } }
步骤4:验证访问路径
你的Cotizacion类根路径为@Path(""),方法路径为@Path("/cotizacion"),结合web.xml的/rest/*前缀,完整访问地址应为:http://localhost:8083/CAJWebApp/rest/cotizacion
排查要点
- 确保所有Jakarta相关依赖版本统一(Jersey 3.x对应Jakarta REST 3.x,Tomcat 10.x对应Jakarta EE 9+)
- 检查
WEB-INF/lib下是否包含所有Jersey必要jar包,无遗漏 - Tomcat版本适配:Tomcat 10.x使用
jakarta.*包名,Tomcat 9.x需切换为javax.*版本的JAX-RS依赖
内容的提问来源于stack exchange,提问作者Gustavo Moreira
相关产品推荐
相关产品推荐

