Spring Boot集成Docker后RequestMapping请求失效问题排查
Spring Boot Docker部署后接口404问题排查与解决
问题描述
用Spring Boot实现学生CRUD接口,本地测试所有接口(localhost:8080/api/v1/person及子路径)正常,但Docker容器启动后,所有自定义接口请求均返回404错误,容器本身运行正常。
排查与解决步骤
1. 确认Docker端口映射是否正确
Docker运行时必须将容器内的8080端口映射到主机的8080端口,否则主机请求无法到达容器内的服务。
- 正确的运行命令示例:
docker run -d -p 8080:8080 --name student-crud 你的镜像名称:标签 - 验证端口映射:执行
docker ps,查看容器的PORTS列,需显示0.0.0.0:8080->8080/tcp或:::8080->8080/tcp。
2. 检查Jar包是否正确构建
Docker中复制的Jar包可能不是可执行的Spring Boot Jar,导致服务未正确加载接口:
- 本地先验证Jar包有效性:
确认本地能正常访问接口后,再重新构建Docker镜像。mvn clean package java -jar target/[你的Jar文件名].jar - 确保pom.xml中已引入Spring Boot打包插件,否则生成的Jar无法独立运行:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
3. 检查应用上下文路径配置
如果本地或Docker环境中设置了自定义上下文路径,会导致接口前缀变化:
- 查看
src/main/resources/application.properties(或application.yml),若存在以下配置:
则Docker部署后的接口路径应为server.servlet.context-path=/myapplocalhost:8080/myapp/api/v1/person;若不需要上下文路径,直接删除该配置。
4. 验证容器内服务启动日志,确认Controller映射
通过容器日志确认Spring Boot是否正确扫描并映射了Controller:
- 查看日志命令:
docker logs [容器ID或容器名] - 搜索关键字
Mapped,若能看到类似以下日志,说明接口映射正常:Mapped "{POST [/api/v1/person]}" onto public br.com.qtivate.server.model.Response br.com.qtivate.server.api.StudentController.addStudent(br.com.qtivate.server.model.Student) - 若没有映射记录,检查Spring Boot主类的包结构:
Spring Boot默认扫描主类所在包及其子包的组件。如果主类不在br.com.qtivate.server包下,需在主类添加扫描配置:@SpringBootApplication(scanBasePackages = "br.com.qtivate.server") public class StudentApplication { public static void main(String[] args) { SpringApplication.run(StudentApplication.class, args); } }
内容的提问来源于stack exchange,提问作者Leonardo Hana
相关产品推荐
相关产品推荐

