java—如何抛出定制异常而不是使用SpringBoot抛出500

j1dl9f46  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(552)

我试图从SpringBootController抛出一个定制的异常(即400,带有一些错误消息),但它总是抛出500

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

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

@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(“invalid ”);
不知道我哪里做错了。我预计将看到400如下。请告知。谢谢

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

wsewodh21#

你应该使用 @ControllerAdvice 在全球范围内 @ExceptionHandler 是基于控制器的(cf:spring blog链接到下面基于控制器的异常处理)

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

在全局异常处理中使用spring blog

wsxa1bj1

wsxa1bj12#

这个 @ExceptionHandler 仅适用于 @Controller 在教室里。

相关问题