在Spring MVC中使用@JsonView

时间:2011-04-24 18:12:59

标签: java json spring spring-mvc java-ee

我正在使用以下bean定义来使我的spring应用程序在JSON中进行通信

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />

此消息转换器bean是否可以使用@JsonView注释?

2 个答案:

答案 0 :(得分:18)

从v1.4起,

@JsonView在Jackson JSON处理器中为already supported

新编辑:已针对Jackson 1.9.12进行了更新

根据v1.8.4 documentation我正在使用的函数writeValueUsingView现在是不推荐使用 使用ObjectMapper.viewWriter(java.lang.Class)而不是< / em> ...但是这也是不推荐 从1.9开始,使用writerWithView(Class)代替! (见v1.9.9 documentation

所以这是一个更新的示例,使用Spring 3.2.0和Jackson 1.9.12测试,它只返回{id: 1}而不是扩展{name: "name"},因为它使用的是.writerWithView(Views.Public.class)。切换为Views.ExtendPublic.class将导致{"id":1,"name":"name"}

package com.demo.app;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import org.codehaus.jackson.map.annotate.JsonView;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

@Controller
public class DemoController {
    private final ObjectMapper objectMapper = new ObjectMapper();

    @RequestMapping(value="/jsonOutput")
    @ResponseBody
    public String myObject(HttpServletResponse response) throws IOException {
        ObjectWriter objectWriter = objectMapper.writerWithView(Views.Public.class);
        return objectWriter.writeValueAsString(new MyObject());
    }

    public static class Views {
        static class Public {}
        static class ExtendPublic extends Public {}
    }

    public class MyObject {
        @JsonView(Views.Public.class) Integer id = 1;
        @JsonView(Views.ExtendPublic.class) String name = "name";
    }
}

上一页修改:您需要实例化ObjectMapper并使用自定义视图写出对象,如图here所示,或者在此示例中:

定义视图:

class Views {
    static class Public {}
    static class ExtendedPublic extends PublicView {}
    ...
}

public class Thing {
    @JsonView(Views.Public.class) Integer id;
    @JsonView(Views.ExtendPublic.class) String name;
}

使用观点:

private final ObjectMapper objectMapper = new ObjectMapper();

@RequestMapping(value = "/thing/{id}")
public void getThing(@PathVariable final String id, HttpServletResponse response) {
    Thing thing = new Thing();
    objectMapper.writeValueUsingView(response.getWriter(), thing, Views.ExtendPublic.class);
}

如果您使用的是Jackson&gt; = 1.7,您可能会发现@JSONFilter更适合您的需求。

答案 1 :(得分:7)

Spring上不支持@JsonView注释,但这个问题已经解决了! 关注this

  

添加对Jackson序列化视图的支持

     

Spring MVC现在支持Jackon的渲染序列化视图   来自不同控制器的相同POJO的不同子集   方法(例如详细页面与摘要视图)。   问题:SPR-7156

这是SPR-7156

  

状态:已解决

     

<强>描述

     

杰克逊的JSONView注释允许开发人员控制方法的哪些方面是序列化的。在当前实现中,必须使用Jackson视图编写器,但是内容类型不可用。如果作为RequestBody注释的一部分,可以更好地指定JSONView。

Spring ver >= 4.1

上提供

谢谢春天!