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版本:
- 修改
pom.xml中的Jakarta EE依赖版本:<dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>8.0.0</version> <scope>provided</scope> </dependency> - 替换代码中的包引用:将所有
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"; } }
- MyApplication.java:
- 重新编译部署项目到Tomcat 9即可。
方案三:在Tomcat 9中添加Resteasy Jakarta EE 10实现(不推荐)
若坚持使用Tomcat 9,需手动引入Resteasy的Jakarta EE 10实现并配置Servlet:
- 在
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> - 添加
web.xml配置文件,指定Resteasy Servlet:
注意:此方式可能因Tomcat 9原生的<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>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
相关产品推荐
相关产品推荐

