当RestTemplate从spring获得空响应时会发生什么?

Tho*_*mas 2 java spring spring-mvc

我想知道Spring服务器在客户端返回空对象(而不是“空”对象)时发生了什么。它会引发异常吗?还是只是将其标记为null

客户代码:

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

服务器代码:

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

我当然简化了代码。我在这里问的原因是,打开调试服务器并使用pom.xml等创建所有这些内容都需要一个简单的基本环境(我是Spring的新手)。

Sot*_*lis 5

当您使用注释您的处理程序方法时@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果返回值为 null,则不会将任何内容写入主体。

RestTemplate因此,将尝试MyDto从空序列反序列化a StringRestTemplate使用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 + "]");
}
Run Code Online (Sandbox Code Playgroud)

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

所以你MyDto在这里的对象

MyDto obj = restTemplate.getForObject(url, MyDto.class);
Run Code Online (Sandbox Code Playgroud)

将会null