部署SpringBoot测试API至Tomcat后调用出现404错误求助
问题排查与解决步骤
1. 检查组件扫描配置
确保SpringBoot主启动类能扫描到PersonController:
- 主启动类的包路径需包含Controller所在包,比如主启动类在
com.example.demoApp,Controller应放在com.example.demoApp.controller或其子包下。 - 若包结构不符合,在主启动类上添加
@ComponentScan(basePackages = {"你的Controller所在包路径"})。
2. 修正实体类大小写问题
代码中所有person应改为Person(实体类首字母大写),示例修正如下:
@PostMapping public void addPerson(@Valid @NonNull @RequestBody Person person) { personService.addPerson(person); } @GetMapping(path = "{id}") public Person getPersonById(@PathVariable("id") UUID id) { return personService.getPersonById(id) .orElse(null); }
大小写错误可能导致Spring无法正确解析请求体或返回值,间接影响路由映射的识别。
3. 确认WAR包部署配置
如果是打包成WAR部署到Tomcat,需确保SpringBoot项目配置正确:
- 主启动类继承
SpringBootServletInitializer并重写configure方法:
@SpringBootApplication public class DemoAppApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoAppApplication.class); } public static void main(String[] args) { SpringApplication.run(DemoAppApplication.class, args); } }
pom.xml中设置打包方式为WAR,并排除内置Tomcat避免冲突:
<packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加对应Tomcat版本的servlet API依赖 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>9.0.80</version> <scope>provided</scope> </dependency> </dependencies>
4. 验证请求路径与方法匹配
- 确保请求路径完全匹配:
http://localhost:8080/demoApp/api/v1/person- GET请求:对应
getAllPeople()方法,无需参数 - POST请求:需携带符合
Person结构的JSON请求体 - 带ID的GET请求:
http://localhost:8080/demoApp/api/v1/person/{UUID}
- GET请求:对应
- 使用Postman或curl测试不同请求方法,排除客户端请求方式错误导致的问题。
5. 查看Tomcat日志
检查Tomcat的logs/catalina.out或localhost.log,确认PersonController的映射是否被正确注册。日志中会显示类似内容:
Mapped "{[/api/v1/person],methods=[GET]}" onto public java.util.List<com.example.demoApp.model.Person> com.example.demoApp.controller.PersonController.getAllPeople()
如果没有这类日志,说明Controller未被正确加载。
内容的提问来源于stack exchange,提问作者Việt Thắng Nguyễn
相关产品推荐
相关产品推荐

