部署在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
相关产品推荐
相关产品推荐

