2011-02-23 498 views
2

我有一個普通的spring3 Web項目設置,並有一個控制器方法是這樣的:Spring3 REST Web服務

@RequestMapping(method = RequestMethod.GET, value = "/book/{id}", headers = "Accept=application/json,application/xml") 
public @ResponseBody 
Book getBook(@PathVariable final String id) 
{ 
    logger.warn("id=" + id); 
    return new Book("12345", new Date(), "Sven Haiges"); 
} 

它返回將被轉換成JSON或XML的一本新書的對象,因爲我在春季配置變壓器配置:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonConverter" /> 
      <ref bean="marshallingConverter" /> 
     </list> 
    </property> 
</bean> 

JSON生成(和XML)的所有作品,但我希望能夠爲數據定義多個視圖。例如,我想指定一個詳細的視圖,在公開的JSON/XML中使用較少的屬性,並使用一組完整的屬性指定一個詳細視圖。

使用傑克遜的ObjectMapper這是可能是這樣的:

 
objectMapper.writeValueUsingView(out, beanInstance, ViewsPublic.class); 

有沒有一種方法,我可以配置Spring使用特定視圖(詳細/摘要)?現在唯一的方法是使用從我的控制器方法返回的不同的DTO。

Thanx!

回答

1

如果你需要這個級別的控制,那麼你需要自己做。

因此,而不是使用@ResponseBody,而是使用自己的ObjectMapper手動編寫響應,例如,

private final ObjectMapper objectMapper = new ObjectMapper(); 

@RequestMapping(method = RequestMethod.GET, value = "/book/{id}", headers = "Accept=application/json,application/xml") 
public void getBook(@PathVariable final String id, HttpServletResponse httpResponse) 
{ 
    logger.warn("id=" + id); 
    Book book = new Book("12345", new Date(), "Sven Haiges"); 
    objectMapper.writeValueUsingView(httpResponse.getWriter(), book, ViewsPublic.class); 
} 

順便說一句,在writeValueUsingView JSON的當前版本已過時(見javadoc)。

+1

我會放鬆自動xml/json視圖切換的方式。有沒有辦法來防止這種情況? –