@ControllerAdvice никогда не срабатывает в Spring Boot

Я пытаюсь создать свой собственный ответ для всех типов RestClientResponseException в моем приложении Spring Boot.

Пользовательское исключение, созданное из класса контроллера:

throw new HealthCheckRestException(ex.getResponseBodyAsString());

Мой класс ExceptionHandler выглядит следующим образом:

@Order(Ordered.HIGHEST_PRECEDENCE)
@EnableWebMvc
@ControllerAdvice
public class AvailExceptionHandler {

private static final Logger logger = Logger.getLogger(AvailExceptionHandler.class);

@ExceptionHandler(value=HealthCheckRestException.class)
    public AvailResponse handleHttpErrorResponse(final HealthCheckRestException ex, final HttpServletRequest request){
        logger.error("RestClientException is thrown from HealthCheck API: with status :"
                + ex.getStatusText() + " and exception : "+ ex.getMessage());
        return new AvailResponse(AvailStatus.ERROR);
    }
}

Я пробовал все возможные случаи, такие как:

1) Trying @ExceptionHandler inside the controller class
2) Including @ControllerAdvice(basePackages = "com.org.availabillity.utilities") to scan for specific packages where the controller is defined.
3) Using @Order(Ordered.HIGHEST_PRECEDENCE) to set precedence
4) Using @RestControllerAdvice

Кажется, ничего не перехватывается после создания исключения и вызова метода, аннотированного с помощью @ExceptionHandler

Застрял на некоторое время на этом и нужна помощь. Очень ценю вашу помощь в этом.

I am using spring-web-5.0.6.RELEASE

person sayak    schedule 13.09.2019    source источник
comment
Можете ли вы опубликовать структуру пакета вашего проекта?   -  person    schedule 14.09.2019


Ответы (2)


Попробуйте что-то вроде этого:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

import java.util.Map;

@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public final class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
  private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

  private static final boolean INCLUDE_STACKTRACE = false;

  @ExceptionHandler(Exception.class)
  public ResponseEntity<Map<String, Object>> handle(final WebRequest request, final Throwable exception) {
    log.debug("Fallback handler executed for unhandled exception:", exception);
    return new ResponseEntity<>(new DefaultErrorAttributes().getErrorAttributes(request, INCLUDE_STACKTRACE),
        HttpStatus.INTERNAL_SERVER_ERROR);
  }

  // IllegalArgumentException is not "entirely correct", so replace this with your own
  @ExceptionHandler(IllegalArgumentException.class)
  public ResponseEntity<Map<String, Object>> handle1(final WebRequest request, final Throwable exception) {
    log.debug("Fallback handler executed for unhandled exception:", exception);
    return new ResponseEntity<>(new DefaultErrorAttributes().getErrorAttributes(request, INCLUDE_STACKTRACE),
        HttpStatus.INTERNAL_SERVER_ERROR);
  }

  // TODO: Keep adding exception(s) handlers for particular cases
}

GlobalExceptionHandler — это просто компонент/компонент Spring, который можно разместить где угодно, при условии, что вы настроили это место для обнаружения.

@EnableWebMvc следует поместить в класс с аннотацией @Configuration. Более того, если вы используете Spring Boot, скорее всего, он вам не нужен, потому что он будет выведен.

person x80486    schedule 13.09.2019

Вот небольшой пример из моего класса Handler;

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler({QueryNotFoundException.class,ContentNotAllowedException.class})
public final ResponseEntity<ApiError> handleException(Exception ex, WebRequest request) {
    HttpHeaders headers = new HttpHeaders();

    if (ex instanceof QueryNotFoundException) {
        HttpStatus status = HttpStatus.NOT_FOUND;
        QueryNotFoundException qnfe = (QueryNotFoundException) ex;
        return handleQueryNotFoundException(qnfe, headers, status, request);
     } else if (ex instanceof ContentNotAllowedException) {
        HttpStatus status = HttpStatus.BAD_REQUEST;
        ContentNotAllowedException cnae = (ContentNotAllowedException) ex;
        return handleContentNotAllowedException(cnae, headers, status, request);
    } else {
        HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
        return handleExceptionInternal(ex, null, headers, status, request);
    }
person Habil    schedule 13.09.2019