You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    • 重新构建镜像并启动容器: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" ]
      

4. 路由匹配或端点注册异常

需确认容器内Spring是否正确注册了这两个端点。

  • 排查步骤:
    • 启用Spring Boot Actuator查看端点映射:
      1. 在pom.xml添加Actuator依赖:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
      2. 在application.properties中配置暴露映射端点:
        management.endpoints.web.exposure.include=mappings
        
      3. 重新部署后访问http://localhost:8080/actuator/mappings,查看是否存在/user/hello和/user/me的路由记录。
    • 查看容器日志:执行docker logs springElastic,检查启动时是否有Controller初始化或属性注入相关的错误信息。

内容的提问来源于stack exchange,提问作者coderoffuture

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:36:00