gpt4 book ai didi

java - 当 RestTemplate 从 spring 得到一个 null 响应时会发生什么?

转载 作者:行者123 更新时间:2023-11-30 06:20:44 29 4
gpt4 key购买 nike

我想知道当 spring 服务器在客户端返回一个空对象(而不是“空”对象)时发生了什么。它会引发异常吗?或者也简单地将其标记为 null

客户端代码:

// Does it throw an exception or will I have obj==null or obj "empty" ?
MyDto obj = restTemplate.getForObject(url, MyDto.class);

服务器代码:

@RequestMapping(value = "/urlpath", method = RequestMethod.GET)
@ResponseBody
public MyDto getObj() {
return null;
}

我当然简化了代码。我在这里问的原因是打开我的调试服务器并使用 pom.xml 等创建一个简单的基本环境需要很长时间(我是 spring 的新手)。

最佳答案

当您使用 @ResponseBody 注释您的处理程序方法时,Spring 使用 RequestResponseBodyMethodProcessor 生成响应主体。它在其实现为

handleReturnValue 方法中执行此操作
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
throws IOException, HttpMediaTypeNotAcceptableException {

mavContainer.setRequestHandled(true);
if (returnValue != null) {
writeWithMessageConverters(returnValue, returnType, webRequest);
}
}

因此,如果返回值为 null,则不会向正文写入任何内容。

因此,RestTemplate 将尝试从一个空的 String 中反序列化一个 MyDtoRestTemplate 使用 HttpMessageConvertExtractor 反序列化响应。 extractData 方法实现为

@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public T extractData(ClientHttpResponse response) throws IOException {
if (!hasMessageBody(response)) {
return null;
}
MediaType contentType = getContentType(response);

for (HttpMessageConverter<?> messageConverter : this.messageConverters) {
if (messageConverter instanceof GenericHttpMessageConverter) {
GenericHttpMessageConverter<?> genericMessageConverter = (GenericHttpMessageConverter<?>) messageConverter;
if (genericMessageConverter.canRead(this.responseType, null, contentType)) {
if (logger.isDebugEnabled()) {
logger.debug("Reading [" + this.responseType + "] as \"" +
contentType + "\" using [" + messageConverter + "]");
}
return (T) genericMessageConverter.read(this.responseType, null, response);
}
}
if (this.responseClass != null) {
if (messageConverter.canRead(this.responseClass, contentType)) {
if (logger.isDebugEnabled()) {
logger.debug("Reading [" + this.responseClass.getName() + "] as \"" +
contentType + "\" using [" + messageConverter + "]");
}
return (T) messageConverter.read((Class) this.responseClass, response);
}
}
}
throw new RestClientException(
"Could not extract response: no suitable HttpMessageConverter found for response type [" +
this.responseType + "] and content type [" + contentType + "]");
}

换句话说,如果没有主体,则返回null

所以你的 MyDto 对象在这里

MyDto obj = restTemplate.getForObject(url, MyDto.class);

将为 null

关于java - 当 RestTemplate 从 spring 得到一个 null 响应时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21383679/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com