Spring 使用 VndErrors 处理 HATEOAS 错误
Spring HATEOAS error handling with VndErrors
我正在努力寻找一种干净的方法来处理启用 HATEOAS 所产生的错误 api。
基本上我们的后端服务是一个 spring 应用程序,在出现异常的情况下使用 @ControllerAdvice
到 return 一个 VndErrors
实例返回给消费者。
VndErrors
由 spring-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>
来反序列化我们的错误。
我正在努力寻找一种干净的方法来处理启用 HATEOAS 所产生的错误 api。
基本上我们的后端服务是一个 spring 应用程序,在出现异常的情况下使用 @ControllerAdvice
到 return 一个 VndErrors
实例返回给消费者。
VndErrors
由 spring-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>
来反序列化我们的错误。