4

「hr」と呼ばれるSpringクラウドサービスと、Feignをクライアントとして使用してhrサービスを呼び出すAPIゲートウェイサービスがあります。hr サービスで例外が発生した場合、型が の json メッセージが返されますResponseEntity<ServiceException>。のServiceExceptionようなものです:

public class ServiceException extends Exception {

    private String errorCode;
    // constructors omitted
}

feign.codec.ErrorDecoderAPI ゲートウェイ サービスでは、次のようにカスタマイズしました。

@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

どなたか、ケースのアドバイスをいただけないでしょうか。

4

0 に答える 0