Java SpringBoot自定义异常字段未生效,寻求解决建议
解决Spring自定义异常处理不生效的问题
以下是针对你的问题的排查和修复步骤:
1. 确保异常处理类添加了@ControllerAdvice注解
你提供的代码只展示了@ExceptionHandler方法,但如果所在类没有标记@ControllerAdvice,Spring无法识别这个全局异常处理器。需要补充该注解:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(UserNotVerified.class) public ResponseEntity<Object> handleException(UserNotVerified exception) { UserNotVerifiedResponse apiException = new UserNotVerifiedResponse(exception.getPhoneNumber()); return new ResponseEntity<>(apiException, HttpStatus.UNAUTHORIZED); } }
2. 给自定义响应类添加Getter方法
Spring序列化响应对象时需要访问字段的Getter方法,否则无法正确输出phoneNumber字段:
public class UserNotVerifiedResponse { private final String phoneNumber; public UserNotVerifiedResponse(String phoneNumber) { this.phoneNumber = phoneNumber; } // 添加Getter方法 public String getPhoneNumber() { return phoneNumber; } }
3. 移除异常类上的@ResponseStatus注解
该注解会让Spring自动生成默认错误响应,和你自定义的ResponseEntity返回逻辑冲突,移除后可确保走你定义的处理器逻辑:
public class UserNotVerified extends RuntimeException{ private final String phoneNumber; public UserNotVerified(String message, String phoneNumber) { super(message); this.phoneNumber = phoneNumber; } public String getPhoneNumber(){ return phoneNumber; } }
4. 验证异常是否被正确抛出
检查业务逻辑中foundUser.ifPresent()是否真的触发了异常:可以在throw语句处添加日志或断点,确认代码执行到了这一步。
5. 设置异常处理器的优先级
如果项目中有多个全局异常处理器,可通过@Order注解提升当前处理器的优先级,避免被其他处理器覆盖:
@ControllerAdvice @Order(Ordered.HIGHEST_PRECEDENCE) public class GlobalExceptionHandler { // ... 异常处理方法 }
完成以上步骤后,重新测试接口,应该会返回包含手机号的自定义响应:
{ "phoneNumber": "你设置的手机号" }
内容的提问来源于stack exchange,提问作者user9347049
相关产品推荐
相关产品推荐

