Я использую openFeign от Netflix для создания REST-связи с внешним API.Я использовал Feign errorDecoder для обработки ложных исключений.
public class MyErrorDecoder implements ErrorDecoder {
private final ErrorDecoder defaultErrorDecoder = new Default();
@Override
public Exception decode(String methodKey, Response response) {
if (response.status() == 404) {
return new MyNotFoundException();
return defaultErrorDecoder.decode(methodKey, response);
}}
Чтобы забрать MyErrorDecoder к Spring, я поместил его в ApplicationContext:
@Bean
public MyErrorDecoder myErrorDecoder() {
return new MyErrorDecoder();
}
Я также реализовал класс ExceptionTranslator для обработкиэти исключения.
@ControllerAdvice
public class ExceptionTranslator {
private static final Logger log = LoggerFactory.getLogger(ExceptionTranslator.class);
@ExceptionHandler(MyNotFoundException.class)
@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorData myNotFoundExc(MyNotFoundException exception){
log.warn(exception.getMessage(), exception);
return new ErrorData(exception.getMessage());
}
@ExceptionHandler(Exception.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorData processRuntimeException(Exception exception){
log.error(exception.getMessage(), exception);
return new ErrorData(exception.getMessage());
}
}
Всякий раз, когда приложение выдает MyNotFoundException
, оно потребляется @ExceptionHandler(Exception.class)
вместо @ExceptionHandler(MyNotFoundException.class)
.Когда я удалил @ExceptionHandler(Exception.class)
, он работает так, как я хочу.
У кого-нибудь есть идеи, как добиться ожидаемого поведения?