如何将 Spring 的 RestTemplate 配置为在返回 HTTP 状态 404 时返回 null

2022-09-01 17:20:30

我正在调用返回 XML 的 REST 服务,并用于封送我的类(例如 、等)。所以我的客户端代码看起来像这样:Jaxb2MarshallerFooBar

    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);

当服务器端的查找失败时,它将返回一个 404 以及一些 XML。我最终得到一个抛出,因为它无法读取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 时返回?RestTemplateRestTemplate.getForObject()null


答案 1
Foo foo = null;
try {
    foo = restTemplate.getForObject(url, Foo.class, vars);
} catch (HttpClientErrorException ex)   {
    if (ex.getStatusCode() != HttpStatus.NOT_FOUND) {
        throw ex;
    }
}

答案 2

要捕获404未找到错误,您可以捕获HttpClientErrorException.NotFound

Foo foo;
try {
    foo = restTemplate.getForObject(url, Foo.class, vars);
} catch (HttpClientErrorException.NotFound ex) {
    foo = null;
}