Как заставить настроенные 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
аннотация не работает.
Кто-нибудь может дать мне несколько советов по делу, пожалуйста.