如何获取所有由@ExceptionHanlder注释的异常处理程序?

时间:2018-07-16 05:46:40

标签: java spring spring-boot

如何获取所有由@ExceptionHanlder注释的异常处理程序,我可以手动调用它们?

背景
我需要使用自己的异常处理程序来处理一些异常,但是在某些情况下,我处理的异常不会在spring之前直接抛出,而是由原因包装。因此,我需要在现有@ExceptionHandler中使用我自己的异常处理策略在一个地方处理由异常引起的这些错误。我该怎么办?

4 个答案:

答案 0 :(得分:0)

您可以扩展ResponseEntityExceptionHandler并将其设置为@ControllerAdvise,如下所示。

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler({YourException.class})
    public ResponseEntity<Object> handleMyException(Exception ex, WebRequest request) {
            ... handle the way you like it
            return new ResponseEntity<Object>(YourErrorObject, new HttpHeaders(), HttpStatus);
    }
}

答案 1 :(得分:0)

Spring提供了@ControllerAdvice批注,我们可以将其与任何类一起使用来定义全局异常处理程序。 Global Controller Advice中的处理程序方法与基于Controller的异常处理程序方法相同,并且在controller类无法处理异常时使用。

您想在一个地方使用异常处理策略。您可以在异常控制器中定义多个异常或使用异常来发出消息。

像这样:

@ExceptionHandler(value = { HttpClientErrorException.class, HTTPException.class, HttpMediaTypeException.class,
            HttpMediaTypeNotSupportedException.class, HttpMessageNotReadableException.class })

@ExceptionHandler
@ResponseBody
ExceptionRepresentation handle(Exception exception) {
    ExceptionRepresentation body = new ExceptionRepresentation(exception.getLocalizedMessage());
    HttpStatus responseStatus = resolveAnnotatedResponseStatus(exception);

    return new ResponseEntity<ExceptionRepresentation>(body, responseStatus);
}

HttpStatus resolveAnnotatedResponseStatus(Exception exception) {
    ResponseStatus annotation = findMergedAnnotation(exception.getClass(), ResponseStatus.class);
    if (annotation != null) {
        return annotation.value();
    }

    return HttpStatus.INTERNAL_SERVER_ERROR;
}

答案 2 :(得分:0)

这是一种解决方法。您可以捕获包装异常,然后检查异常的根本原因。这是一个MySQLIntegrityConstraintViolationException的示例,该示例由Spring的DataIntegrityViolationException包装:

@ExceptionHandler(DataIntegrityViolationException.class)
@ResponseBody
public ResponseEntity<Object> proccessMySQLIntegrityConstraint(DataIntegrityViolationException exception) {
    if (exception.getRootCause() instanceof MySQLIntegrityConstraintViolationException) {
       doSomething....
    } else {
        doSomethingElse...
    }
}

答案 3 :(得分:0)

尝试使用Java Reflection Api查找带有“ ExceptionHanlder”注释的类。并调用任何方法或任何您想要的方法。