我设置了一个普通的spring3 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");
}
它会返回一个新的book对象,由于我在spring config中设置的变换器,它将转换为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中指定一个具有较少属性的详细视图,以及一个包含完整属性集的详细视图。
使用Jackson的ObjectMapper可以这样:
objectMapper.writeValueUsingView(out, beanInstance, ViewsPublic.class);
有没有办法让Spring配置使用特定的VIEW(详细/摘要)?现在实现这一目标的唯一方法是使用从我的控制器方法返回的不同DTO。
感谢名单!
答案 0 :(得分: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);
}
顺便说一下,在当前版本的JSON中不推荐使用writeValueUsingView
(请参阅javadoc)。