3

カスタム ErrorDecoder を実装しました。

public class WebShopErrorDecoder implements ErrorDecoder {

  @Override
  public Exception decode(String methodKey, Response response) {

    JacksonDecoder jacksonDecoder = new JacksonDecoder();
    try {
        ErrorResource error = (ErrorResource) jacksonDecoder.decode(response, ErrorResource.class);

        return new EShopRequestException(error, HttpStatus.valueOf(response.status()));
    } catch (IOException e) {

        return new EShopRequestException(new ErrorResource("error.internal", "Internal server error"),
                HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }
}

これで達成したいことWebShopErrorDecoderは、エラー応答を転送することです。私の問題は、応答ステータスが 404 の場合、ErrorResourceerrorが null であることです。

たとえば、返された応答ステータスを 400 に変更すると、エラー リソースに応答が含まれます。

消費されたサービスをブラウザから直接リクエストすると、レスポンス ステータスが 404 のレスポンス ボディが表示されます。

サービスが 404 を返すときに偽のリクエストのレスポンス本文が空になるのはなぜですか? レスポンスボディを取得する方法はありますか?

ふりをし始めたばかりなので、質問が不明な場合はお知らせください。何が欠けているのかを明確にしようとします。

前もって感謝します!

4

1 に答える 1

2

さて、応答が空である理由がわかりました。それは私のせいだと偽っているわけではありません。

私は JacksonDecoder を使用しているので、JacksonDecoder 内の次のコードが原因で応答ステータスが 404 の場合、常に空の応答が返されます。

..
public Object decode(Response response, Type type) throws IOException {
    if(response.status() == 404) {
        return Util.emptyValueOf(type);
    }
..

代わりに私がやっているのはResponseEntityDecoder.

public class WebShopErrorDecoder implements ErrorDecoder {

  private final ResponseEntityDecoder decoder;

  public WebShopErrorDecoder(ResponseEntityDecoder decoder) {
    this.decoder = decoder;
  }

  @Override
  public Exception decode(String methodKey, Response response) {
    try {
        ErrorResource error = (ErrorResource) decoder.decode(response, ErrorResource.class);

        return new EShopRequestException(error, HttpStatus.valueOf(response.status()));
    } catch (IOException e) {

        return new EShopRequestException(new ErrorResource("error.internal", "Internal server error"),
                HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }
}

今、すべてが正常に動作します:)

于 2016-05-07T14:34:55.180 に答える