「hr」と呼ばれるSpringクラウドサービスと、Feignをクライアントとして使用してhrサービスを呼び出すAPIゲートウェイサービスがあります。hr サービスで例外が発生した場合、型が の json メッセージが返されますResponseEntity<ServiceException>
。のServiceException
ようなものです:
public class ServiceException extends Exception {
private String errorCode;
// constructors omitted
}
feign.codec.ErrorDecoder
API ゲートウェイ サービスでは、次のようにカスタマイズしました。
@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"
}
エラー メッセージの形式を変更し、少なくともclassのerrorCode
フィールドを追加したいので、例外を処理するための注釈クラスを追加します。しかし残念ながら、それはうまくいきません。一部のフィルターからだけコントローラーによって例外がスローされないため、注釈が機能しない可能性があります。ServiceException
@ControllerAdvice
@ControllerAdvice
どなたか、ケースのアドバイスをいただけないでしょうか。