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的新手)。
当您使用注释您的处理程序方法时@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 String。RestTemplate使用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。
| 归档时间: |
|
| 查看次数: |
9079 次 |
| 最近记录: |