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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:04:56