Spring 使用 VndErrors 处理 HATEOAS 错误

Spring HATEOAS error handling with VndErrors

我正在努力寻找一种干净的方法来处理启用 HATEOAS 所产生的错误 api。

基本上我们的后端服务是一个 spring 应用程序,在出现异常的情况下使用 @ControllerAdvice 到 return 一个 VndErrors 实例返回给消费者。

VndErrorsspring-hateoas 提供,一旦 returned 将被序列化并标记为 application/vnd.error.

在服务消费者部分,我们也使用 spring-hateoas,我们通过标准 RestTemplate.

与后端服务通信

RestTemplate 中的默认值 ResponseErrorHandler 会为客户端、服务器或未知的 http 状态响应抛出异常,但它不会尝试反序列化响应主体。

public MyBusinessConcept myBusinessConcept() {
    try {
        return restTemplate().exchange("http://foo/bar",  ..., MyBusinessConcept.class).getBody();
    } catch (HttpClientErrorException e) {
        // ???
    }
}

我们如何从失败的 HTTP 响应中取回 VndErrors 实例?

经过大量研究,我碰巧在其他 spring module.

中找到了答案

基本上一个解决方案是实现 ResponseErrorHandler 接口,使用继承或组合(更好)回退到 DefaultResponseErrorHandler。该实现将使用 ResponseExtractor<VndErrors> 来反序列化我们的错误。