微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用spring boot抛出自定义异常而不是500

如何解决如何使用spring boot抛出自定义异常而不是500

我试图从 spring boot 控制器抛出一个自定义异常(即 400 带有一些错误消息),不知何故它总是抛出 500

{
  "timestamp": "2021-01-06T17:39:49.648+0000","status": 500,"error": "Internal Server Error","message": "invalid xxx","path": "/abc/def"
}

我创建了一个异常处理程序来处理由控制器调用的我的服务抛出的自定义异常,该异常假设返回 400。当我调试它时,我可以看到它实际上已被调用,但它没有被直接抛出作为响应,如果我继续调试,我可以看到 BasicErrorController 仍然会被调用(我认为不应该因为我有一个自定义的异常处理程序,请纠正我我错了),我可以看到状态此时响应已更改为 500,并且我的自定义异常已被此“内部服务器错误”包裹

@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class RegistrationExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = RegistrationException.class)
    protected ResponseEntity<Object> handleRegistrationError(RegistrationException ex){
        return  ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .contentType(MediaType.APPLICATION_JSON)
                .body(ex);
    }



我已经配置了我的应用程序类来扫描这个处理程序类,我认为它正在工作,因为它会在服务抛出 RegistrationException 时被调用

在我的服务中,我调用它并将异常级联到控制器 throw new RegistrationException("无效的xxx");

不知道我哪里做错了。我希望看到 400 如下。请指教。谢谢

{
  "timestamp": "2021-01-06T17:39:49.648+0000","status": 400,"error": "Bad Request","path": "/abc/def"
}

解决方法

'query_var' => 'a' 仅在其所在的 @ExceptionHandler 类中有效。

,

您应该使用 @ControllerAdvice 来全局处理它们,因为 @ExceptionHandler 是基于控制器的(cf:Spring 博客链接如下 基于控制器的异常处理)

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.BAD_REQUEST)  // 400
    @ExceptionHandler(RegistrationException.class)
    public void handleConflict() {
        // Nothing to do
    }
}

全局异常处理

中使用Spring Blog

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。