Как заставить настроенные ErrorDecoder и @ExceptionHandler работать вместе в весеннем облаке

У меня есть весенний облачный сервис под названием "hr" и сервис API-шлюза, использующий Feign в качестве клиента для вызова сервиса hr. Если в службе hr возникли какие-либо исключения, она вернет сообщение json, тип которого ResponseEntity<ServiceException>, ServiceException как:

public class ServiceException extends Exception {

    private String errorCode;
    // constructors omitted
}

В службе шлюза API я настроил feign.codec.ErrorDecoder лайк:

@Service
public class SpringWebClientErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.readValue(response.body().asInputStream(), ServiceException.class);
        } catch (IOException e) {
            logger.info("Failed to process response body");
            throw new RuntimeException("Failed to process response body.", e);
        }
    }

}

Это нормально работает, чтобы получить ServiceException, и я могу получить сообщение об ошибке что-то вроде:

{
  "timestamp": 1468158273181,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "ServiceException",
  "message": "sn should not be empty",
  "path": "/employee"
}

Я хочу изменить формат сообщения об ошибке и, по крайней мере, добавить errorCode поле ServiceException класс, поэтому я добавляю @ControllerAdvice класс аннотации, чтобы попытаться обработать исключение. Но, к сожалению, это не работает. Я, может быть, потому что исключение не выдается контроллером только из некоторых фильтров, поэтому @ControllerAdvice аннотация не работает.

Кто-нибудь может дать мне несколько советов по делу, пожалуйста.

0 ответов

Другие вопросы по тегам