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

veg*_*4me 22 java rest spring jaxb

我打电话返回XML REST服务,并使用Jaxb2Marshaller元帅我的课(例如Foo,Bar等).所以我的客户端代码如下所示:

    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);
Run Code Online (Sandbox Code Playgroud)

当服务器端的查找失败时,它返回404以及一些XML.我最终UnmarshalException因为无法读取XML而被抛出.

Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"exception"). Expected elements are <{}foo>,<{}bar>
Run Code Online (Sandbox Code Playgroud)

回复的主体是:

<exception>
    <message>Could not find a Foo for ID 123</message>
</exception>
Run Code Online (Sandbox Code Playgroud)

如何配置,RestTemplate以便在404发生时RestTemplate.getForObject()返回null

Tim*_*Tim 31

Foo foo = null;
try {
    foo = restTemplate.getForObject(url, Foo.class, vars);
} catch (HttpClientErrorException ex)   {
    if (ex.getStatusCode() != HttpStatus.NOT_FOUND) {
        throw ex;
    }
}
Run Code Online (Sandbox Code Playgroud)


aqe*_*qel 6

要专门捕获 404 NOT FOUND 错误,您可以捕获HttpClientErrorException.NotFound

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