我目前正在使用Sping Boot 3.2/Spring Framework 5.1中的新RestClient,我遇到了处理404错误的挑战。我的目标是优雅地处理这些错误,而不会导致代码中的后续步骤失败,特别是在转换响应体时。
范例:
class CmsClient {
pubic Policy getPolicy() {
return restClient.get()
.uri("some/url")
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.onStatus(ignore404())
.body(Policy.class);
}
public static ResponseErrorHandler ignore404() {
return new ResponseErrorHandler() {
@Override
public boolean hasError(final ClientHttpResponse response) throws IOException {
return response.getStatusCode() == HttpStatus.NOT_FOUND;
}
@Override
public void handleError(final ClientHttpResponse response) {
//Do nothing
}
};
}
}
字符串
这是我得到的例外:
org.springframework.web.client.RestClientException: Error while extracting response for type [package.Policy] and content type [application/json]
at org.springframework.web.client.DefaultRestClient.readWithMessageConverters(DefaultRestClient.java:216)
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.readBody(DefaultRestClient.java:641)
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:589)
at package.CmsClient.getPolicy(CmsClient.java:27)
at package.CmsClientTest.getPolicy_404_ThrowException_Test(CmsClientTest.java:61)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: No content to map due to end-of-input
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:406)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:354)
at org.springframework.web.client.DefaultRestClient.readWithMessageConverters(DefaultRestClient.java:200)
... 7 more
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input
at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 0]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1752)
at com.fasterxml.jackson.databind.ObjectReader._initForReading(ObjectReader.java:360)
at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2095)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1481)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:395)
... 9 more
型
我预计方法.body(Policy.class);
应该返回null,而不是由于MismatchedInputException而触发异常。这种行为与之前在WebClient中观察到的行为一致,我希望在此上下文中有类似的方法。
当前解决方案:作为临时措施,可以在body方法调用中指定String.class。然而,这种方法会损害代码的流动性和易用性,需要使用ObjectMapper和类似工具进行额外处理。
1条答案
按热度按时间nszi6y051#
我通过注册一个自定义消息转换器来解决它:
字符串
这是我的自定义消息转换器:
型
然后,我添加了我在问题中发布的错误处理程序来优雅地处理404:
型