Spring Boot容器化后/user/hello等端点报404问题求助
Spring Boot容器化后部分端点返回404问题排查
问题描述
开发的Spring Boot项目本地运行时所有端点均正常,但通过Docker Compose容器化部署后,/user/hello和/user/me端点返回404错误,其余端点(POST /user、GET /user/{username})可正常工作。
相关代码与配置
UserController代码
@RestController @RequestMapping("/user") public class UserController { @Value("${me}") private String name; private final UserService userService; @Autowired public UserController(UserService userService) { this.userService = userService; } @PostMapping public ResponseEntity<User> createUser(@RequestBody User user) { User created = userService.save(user); return new ResponseEntity<>(created, HttpStatus.CREATED); } @GetMapping("/hello") public String hello() { return "hello"; } @GetMapping("/me") public String me() { return "hello " + name; } @GetMapping("/{username}") public ResponseEntity<User> getUserByUsername(@PathVariable String username) { User user = userService.getByUsername(username); if (user != null) { return new ResponseEntity<>(user, HttpStatus.OK); } return new ResponseEntity<>(HttpStatus.NOT_FOUND); } }
Dockerfile
FROM eclipse-temurin:17-jdk-alpine ARG JAR_FILE=target/*.jar COPY ./target/elasticSpring-0.0.1-SNAPSHOT.jar elasticSpring.jar ENTRYPOINT [ "java","-jar","/elasticSpring.jar" ]
docker-compose.yml
version: '1' services: es: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.12 container_name: es ports: - 9200:9200 - 9300:9300 environment: - discovery.type=single-node networks: - mynet springboot-app: build: context: . dockerfile: Dockerfile container_name: springElastic ports: - 8080:8080 environment: - spring.elasticsearch.uris=es:9200 - spring.data.elasticsearch.cluster-nodes=es:9200 depends_on: - es networks: - mynet networks: mynet: driver: bridge
可能原因与解决办法
1. 打包的JAR未包含最新代码
本地修改代码后未重新构建JAR,导致容器内运行的是旧版本代码,缺少/user/hello和/user/me端点。
- 解决步骤:
- 执行构建命令重新打包:
- Maven:
mvn clean package - Gradle:
./gradlew clean build
- Maven:
- 重新构建镜像并启动容器:
docker-compose up --build
- 执行构建命令重新打包:
2. 环境变量me未配置导致初始化异常
/me端点依赖@Value("${me}")注入的变量,如果容器环境中未配置该变量,Spring初始化Controller时可能出现隐性异常,影响部分端点注册。
- 解决步骤:
- 在
docker-compose.yml的springboot-app服务的environment中添加变量:environment: - spring.elasticsearch.uris=es:9200 - spring.data.elasticsearch.cluster-nodes=es:9200 - me=your-name # 添加此行 - 或者在项目的
application.properties中默认配置:me=default-name,避免环境变量缺失。
- 在
3. Docker构建上下文问题
Dockerfile中硬编码了JAR文件名,若构建上下文(当前目录)下的target目录中JAR文件名不符,会导致容器内运行的JAR不正确。
- 解决步骤:
- 修改Dockerfile使用ARG变量复制JAR,避免硬编码:
FROM eclipse-temurin:17-jdk-alpine ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} elasticSpring.jar # 使用变量代替硬编码文件名 ENTRYPOINT [ "java","-jar","/elasticSpring.jar" ]
- 修改Dockerfile使用ARG变量复制JAR,避免硬编码:
4. 路由匹配或端点注册异常
需确认容器内Spring是否正确注册了这两个端点。
- 排查步骤:
- 启用Spring Boot Actuator查看端点映射:
- 在pom.xml添加Actuator依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> - 在
application.properties中配置暴露映射端点:management.endpoints.web.exposure.include=mappings - 重新部署后访问
http://localhost:8080/actuator/mappings,查看是否存在/user/hello和/user/me的路由记录。
- 在pom.xml添加Actuator依赖:
- 查看容器日志:执行
docker logs springElastic,检查启动时是否有Controller初始化或属性注入相关的错误信息。
- 启用Spring Boot Actuator查看端点映射:
内容的提问来源于stack exchange,提问作者coderoffuture
相关产品推荐
相关产品推荐

