web-dev-qa-db-ja.com

404のHTTPステータスが返されたときにnullを返すようにSpringのRestTemplateを構成する方法

RESTサービスを呼び出し、_Jaxb2Marshaller_を使用してクラス(例:FooBarなど)をマーシャリングします)。私のクライアントコードは次のようになります:

_    HashMap<String, String> vars = new HashMap<String, String>();
    vars.put("id", "123");

    String url = "http://example.com/foo/{id}";

    Foo foo = restTemplate.getForObject(url, Foo.class, vars);
_

サーバー側のルックアップが失敗すると、XMLとともに404を返します。 XMLを読み取ることができないため、UnmarshalExceptionがスローされます。

_Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"exception"). Expected elements are <{}foo>,<{}bar>
_

応答の本文は次のとおりです。

_<exception>
    <message>Could not find a Foo for ID 123</message>
</exception>
_

404が発生した場合にRestTemplate.getForObject()RestTemplateを返すようにnullを構成するにはどうすればよいですか?

22
vegemite4me
Foo foo = null;
try {
    foo = restTemplate.getForObject(url, Foo.class, vars);
} catch (HttpClientErrorException ex)   {
    if (ex.getStatusCode() != HttpStatus.NOT_FOUND) {
        throw ex;
    }
}
31
Tim

サーバー関連のエラーをキャプチャするために、これは内部サーバーエラーを処理します。

}catch (HttpServerErrorException e) {
        log.error("server error: "+e.getResponseBodyAsString());
        ObjectMapper mapper = new ObjectMapper();
        EventAPIResponse eh = mapper.readValue(e.getResponseBodyAsString(), EventAPIResponse.class);
        log.info("EventAPIResponse toString "+eh.toString());
0