TomEE配置的URL无法访问,访问http://localhost:8080/hello时出现404错误求助
你好!我看了你的问题,这种404在TomEE中使用JAX-RS的场景里挺常见的,给你几个实用的排查方向试试看:
先明确你的情况:你写了一个带@Path("/hello")注解的JAX-RS控制器,期望访问http://localhost:8080/hello时返回"Hello, World!",但运行后却收到404错误,试过更换TomEE版本、调整目标URL都没解决问题。
你的控制器代码本身是没问题的:
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 HelloWorldController { @GET @Produces(MediaType.TEXT_PLAIN) public String getHelloWorld() { return "Hello, World!"; } }
接下来可以从这几个关键点排查:
有没有配置JAX-RS的应用入口类?
TomEE需要一个继承Application的类来识别并扫描你的JAX-RS资源,这很可能是你漏掉的关键配置。创建一个这样的类试试:import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/") // 设置根路径,这样你的/hello就直接对应localhost:8080/hello public class JaxRsAppConfig extends Application { // 这个类不需要写任何业务代码,空类即可,TomEE会自动扫描带@Path注解的控制器 }如果没有这个类,TomEE根本不知道你的控制器存在,自然会返回404。
检查应用的上下文路径
看看你TomEE部署设置里,应用的上下文路径是不是设为了/?如果上下文路径是其他值(比如my-test-app),那实际要访问的URL应该是http://localhost:8080/my-test-app/hello,而不是直接根路径下的/hello。确认TomEE版本的JAX-RS支持
确保你使用的是TomEE Web Profile或者Plus版本,这两个版本默认包含JAX-RS的实现(Apache CXF)。如果是TomEE的轻量化版本,可能需要手动添加JAX-RS的依赖包。检查项目依赖是否正确
如果是Maven/Gradle项目,JAX-RS的API依赖要设为providedscope,因为TomEE已经自带了这个依赖,避免重复引入导致冲突:
Maven示例:<dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1.1</version> <scope>provided</scope> </dependency>查看TomEE启动日志
启动TomEE后,留意控制台的日志输出,有没有类似"Registered JAX-RS resource: HelloWorldController"这样的日志?如果没有,说明资源扫描失败,大概率是缺少上面说的Application配置类,或者扫描路径配置不对。
你可以先试试添加JAX-RS应用配置类的方法,这是最常见的问题原因,希望能帮到你!
备注:内容来源于stack exchange,提问作者straptor50

