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

Jakarta EE 10 REST API访问返回404 Not Found错误求助

问题分析与解决方法

核心原因

Apache Tomcat 9.0.x仅支持Jakarta EE 8(基于javax.*包命名空间),而你的项目使用的是Jakarta EE 10(基于jakarta.*包命名空间),二者包名空间不兼容,导致Tomcat无法识别并加载你的JAX-RS应用,最终出现404错误。

解决方案

方案一:升级Tomcat到10.x版本(推荐)

Tomcat 10.1.x及以上版本完全适配Jakarta EE 10的jakarta.*包规范,直接替换Tomcat 9为最新稳定版Tomcat 10.1.x,重新部署项目后即可正常访问http://localhost:8080/Resteasy-examples/app/hello。

方案二:适配Tomcat 9,降级到Jakarta EE 8

如果不想升级Tomcat,可将项目降级为Jakarta EE 8版本:

  1. 修改pom.xml中的Jakarta EE依赖版本:
    <dependency>
        <groupId>jakarta.platform</groupId>
        <artifactId>jakarta.jakartaee-api</artifactId>
        <version>8.0.0</version>
        <scope>provided</scope>
    </dependency>
    
  2. 替换代码中的包引用:将所有jakarta.ws.rs.*的import语句改为javax.ws.rs.*,示例如下:
    • MyApplication.java:
      package service;
      
      import java.util.HashSet;
      import java.util.Set;
      
      import javax.ws.rs.ApplicationPath;
      import javax.ws.rs.core.Application;
      
      @ApplicationPath("/app")
      public class MyApplication extends Application{
      
          Set<Object> singletons = new HashSet<>();
          
          public MyApplication(){
              singletons.add(new HelloResource());
          }
          
          @Override
          public Set<Object> getSingletons() {
              return singletons;
          }
      }
      
    • HelloResource.java:
      package service;
      
      import javax.ws.rs.GET;
      import javax.ws.rs.Path;
      import javax.ws.rs.Produces;
      import javax.ws.rs.core.MediaType;
      
      @Path("/hello")
      public class HelloResource {
      
          @GET
          @Produces(MediaType.TEXT_PLAIN)
          public String getHello() {
              return "HELLO";
          }
      }
      
  3. 重新编译部署项目到Tomcat 9即可。

方案三:在Tomcat 9中添加Resteasy Jakarta EE 10实现(不推荐)

若坚持使用Tomcat 9,需手动引入Resteasy的Jakarta EE 10实现并配置Servlet:

  1. 在pom.xml中添加Resteasy依赖:
    <dependencies>
        <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>
        <!-- 保留原Jakarta EE 10 API依赖 -->
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-api</artifactId>
            <version>10.0.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
  2. 添加web.xml配置文件,指定Resteasy Servlet:
    <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-name>Resteasy</servlet-name>
            <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
            <init-param>
                <param-name>jakarta.ws.rs.Application</param-name>
                <param-value>service.MyApplication</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>Resteasy</servlet-name>
            <url-pattern>/app/*</url-pattern>
        </servlet-mapping>
    </web-app>
    
    注意:此方式可能因Tomcat 9原生的javax.*包与项目jakarta.*包冲突,引发其他问题,仅作为临时方案。

额外验证点

确保项目部署的上下文路径为Resteasy-examples:可检查Tomcatwebapps目录下的项目文件名,或在pom.xml的maven-war-plugin中指定war名称:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.2.3</version>
    <configuration>
        <warName>Resteasy-examples</warName>
    </configuration>
</plugin>

内容的提问来源于stack exchange,提问作者batchu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:02:52