Guisong He
Guisong He

Reputation: 1976

How to get all exception handlers annotated by @ExceptionHanlder?

How to get all exception handlers annotated by @ExceptionHanlder and I can call them manually?

Background
I need to handle some exceptions by my own exception handlers but in some situation my handled exceptions are not thrown directly by spring, and they are wrapped in the cause by. So I need to handle these caused by exceptions in one place using my own exception handling strategy in the existing @ExceptionHandlers. How can I do that?

Upvotes: 3

Views: 1035

Answers (4)

Seymur Asadov
Seymur Asadov

Reputation: 672

Try to use Java Reflection Api to find classes annotated with "ExceptionHanlder". And invoke any method or whatever you want.

Upvotes: 1

thodoris
thodoris

Reputation: 38

Here is a work around. You can catch the the wrapping exception and then check the root cause of the exception. Here is an example of MySQLIntegrityConstraintViolationException which is wrapped by DataIntegrityViolationException in spring:

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

Upvotes: 0

0gam
0gam

Reputation: 1423

Spring provides @ControllerAdvice annotation that we can use with any class to define our global exception handler. The handler methods in Global Controller Advice is same as Controller based exception handler methods and used when controller class is not able to handle the exception.

You want to use exception handling strategy in your one place. that you can define multiple exception or make message using exception in exception controller.

like this :

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

or

@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;
}

Upvotes: 0

Johna
Johna

Reputation: 1894

You can extend ResponseEntityExceptionHandler and make it a @ControllerAdvise like below.

@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);
    }
}

Upvotes: 0

Related Questions