具有Jackson JSON视图的Spring 3 REST Web服务

时间:2011-02-23 15:51:24

标签: json spring rest

我设置了一个普通的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。

感谢名单!

1 个答案:

答案 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)。