2014-01-27 21 views
2

我想知道彈簧服務器在客戶端返回空對象(而不是「空」對象)時發生了什麼。它是否引發異常?或者簡單地將其標記爲nullRestTemplate從spring獲取null響應時會發生什麼?

客戶端代碼:

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

Server代碼:

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

我已經簡化了過程的代碼。我在這裏問的原因是打開我的調試服務器並用pom.xml等創建一個簡單的基本環境需要很長時間(我對Spring很陌生)。

回答

3

當您使用@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 obj = restTemplate.getForObject(url, MyDto.class); 

MyDto對象將是null

相關問題