Java Spring Boot@ControllerAdvice部分工作,不适用于自定义异常

Java Spring Boot@ControllerAdvice部分工作,不适用于自定义异常,java,spring,spring-boot,exception-handling,Java,Spring,Spring Boot,Exception Handling,我在Spring Boot 1.5.3中使用@ControllerAdvice注释的ExceptionHandler时遇到了一个特殊情况。它捕获任何异常默认异常,但如果我抛出自定义异常,它不会触发 异常处理程序: @ControllerAdvice public class ResponseEntityExceptionHandler { @ExceptionHandler({ HttpMessageNotReadableException.class }) protected Respons

我在Spring Boot 1.5.3中使用@ControllerAdvice注释的ExceptionHandler时遇到了一个特殊情况。它捕获任何异常默认异常,但如果我抛出自定义异常,它不会触发

异常处理程序:

@ControllerAdvice
public class ResponseEntityExceptionHandler {

@ExceptionHandler({ HttpMessageNotReadableException.class })
protected ResponseEntity<ErrorModel> handleInvalidJson(RuntimeException e, WebRequest request) {
    return new ResponseEntity<ErrorModel>(new ErrorModel().message("Could not parse JSON."), HttpStatus.BAD_REQUEST);
}

@ExceptionHandler({ NumberFormatException.class })
protected ResponseEntity<ErrorModel> handleInvalidRequest(RuntimeException e, WebRequest request) {
    return new ResponseEntity<ErrorModel>(new ErrorModel().message("Invalid request parameter."), HttpStatus.BAD_REQUEST);
}

@ExceptionHandler({ CannotCreateTransactionException.class })
protected ResponseEntity<ErrorModel> handleTransactionCreationException(RuntimeException e, WebRequest request) {
    return new ResponseEntity<ErrorModel>(new ErrorModel().message("Error connecting to the database, please make sure it is still available."), HttpStatus.BAD_REQUEST);
}

@ExceptionHandler({ NotFoundException.class })
protected ResponseEntity<ErrorModel> handleApiException(RuntimeException e, WebRequest request) {
    return new ResponseEntity<ErrorModel>(new ErrorModel().message(e.getMessage()), HttpStatus.NOT_FOUND);
}
}
例外情况:

public class NotFoundException extends ApiException {
private int code;
public NotFoundException (int code, String msg) {
    super(code, msg);
    this.code = code;
}
}
异常继承自此基类:

public class ApiException extends Exception{
private int code;
public ApiException (int code, String msg) {
    super(msg);
    this.code = code;
}
}
关于为什么自定义异常会避免ExceptionHandler的检测,您有什么想法吗


如果有必要,我很乐意提供其他信息。

对于这种特殊情况,答案是使用
Exception
而不是
RuntimeException
,因为NotFoundException只从Exception继承

值得注意的是:

  • 要捕获所有异常,可以使用
    @ExceptionHandler(Exception.class)

  • 如果对异常使用通用名称,请始终检查是否导入了正确的名称


我添加了您的建议,出于某种原因,这捕获了前3个异常,但没有捕获底部异常。让一个函数捕获所有异常也不是理想的行为。我现在希望捕获特定的异常,以便返回自定义错误消息。选中此选项后,我将导入right NotFoundException:/,我还尝试抛出并捕获更一般的ApiException,但没有成功。确定,我最后一次尝试是在HandLeapIEException中使用Exception而不是RuntimeException:protected ResponseEntity HandLeapIEException(异常e,WebRequest请求){返回新的ResponseEntity(新的ErrorModel().message(e.getMessage()),HttpStatus.NOT_FOUND);哦,天哪,你说得太对了!当然,它不会被捕获为运行时异常…它不是一个!非常感谢你发现了这一点:不客气。我可以更新上面的答案并将其标记为已解决吗?
2017-06-05 11:30:20.080  INFO 9076 --- [           main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler
public class NotFoundException extends ApiException {
private int code;
public NotFoundException (int code, String msg) {
    super(code, msg);
    this.code = code;
}
}
public class ApiException extends Exception{
private int code;
public ApiException (int code, String msg) {
    super(msg);
    this.code = code;
}
}