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

部署在AWS的Spring Boot REST API仅支持POST请求问题排查

问题描述

开发了一个实现用户增删改查的简易Spring Boot REST API,使用AWS RDS(MySQL)作为数据库,通过Elastic Beanstalk部署。遇到以下问题:

  • 仅POST请求能成功创建用户,其余GET、PUT、DELETE端点均返回500内部服务器错误
  • Elastic Beanstalk环境健康状态转为严重,提示"100%请求返回HTTP 5xx错误"
  • MySQL Workbench确认数据已成功保存,但执行POST请求后调用GET端点就触发500错误
  • 本地环境测试所有API完全正常,首次部署后空数据库时GET返回200空数组,POST数据后GET报错

附上UserController代码:

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    // get all users
    @GetMapping
    public List<User> getUsers() {
        return this.userRepository.findAll();
    }

    // get user by id
    @GetMapping("/{id}")
    public User getUserById(@PathVariable(value = "id") long userId) {
        return this.userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User not found with ID: " + userId));
    }

    // create user
    @PostMapping
    public User createUser(@RequestBody User user) {
        return this.userRepository.save(user);
    }

    // update user
    @PutMapping("/{id}")
    public User updateUser(@RequestBody User user, @PathVariable("id") long userId) {
        User existingUser = this.userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User not found with ID: " + userId));
        existingUser.setFirstName(user.getFirstName());
        existingUser.setLastName(user.getLastName());
        existingUser.setEmail(user.getEmail());
        return this.userRepository.save(existingUser);
    }
    // delete user by id
    @DeleteMapping("/{id}")
    public ResponseEntity<User> deleteUser(@PathVariable("id") long userId) {
        User existingUser = this.userRepository.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User not found with ID: " + userId));
        this.userRepository.delete(existingUser);
        return ResponseEntity.ok().build();
    }
}
排查步骤

1. 查看Elastic Beanstalk日志定位具体错误

500错误必须先看服务器端的异常栈才能定位根源:

  • 登录AWS控制台进入Elastic Beanstalk环境,点击左侧日志选项卡
  • 选择请求日志(最近100条)或下载完整日志到本地查看
  • 重点筛选ERROR级别的日志,尤其是排除ResourceNotFoundException外的异常(比如序列化失败、数据库连接池耗尽等)

2. 检查User实体类的序列化问题

POST能保存但GET报错,大概率是实体类序列化失败:

  • 确认User类是否添加了@Entity、@Id、@GeneratedValue等JPA核心注解
  • 检查是否存在循环引用(比如关联其他实体但未添加@JsonIgnore)
  • 确保User类所有字段都有对应的getter方法,或使用Lombok的@Data注解自动生成
  • 若用Lombok,验证打包时注解已被正确处理(pom.xml/build.gradle中配置了Lombok插件)

3. 验证数据库连接配置

虽然POST能成功,但后续操作可能出现连接异常:

  • 检查EB环境配置→软件→环境属性中的数据库连接参数(URL、用户名、密码)是否与本地一致
  • 确认RDS安全组入站规则允许Elastic Beanstalk环境的EC2实例访问(添加EB安全组或对应IP段)
  • 查看application.properties中的连接池配置,比如spring.datasource.hikari.maximum-pool-size是否合理,避免连接耗尽

4. 添加全局异常处理器

代码中抛出的ResourceNotFoundException未被捕获,会触发默认500错误,也无法区分真实异常:

  • 添加全局异常处理类,自定义异常响应:
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGenericException(Exception ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("服务器内部错误");
    }
}
  • 这样既能区分404和真实500错误,也能通过日志看到具体异常信息

5. 检查打包与依赖配置

  • 确认Spring Boot打包为可执行JAR(pom.xml中packaging设为jar,且包含spring-boot-maven-plugin)
  • 检查依赖是否包含spring-boot-starter-web、spring-boot-starter-data-jpa、mysql-connector-java,且版本兼容
  • 排查依赖冲突,排除重复引入的JPA或Web相关依赖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:30:52