【发布时间】:2011-10-17 12:24:34
【问题描述】:
在previous similar question 中,我询问了如何使用 JacksonJson 和 Spring 序列化两组不同的字段。
我的用例是带有 @ResponseBody 注释的典型 Controller 映射,直接返回特定对象或对象集合,然后每当客户端在 Accept 标头中添加 application/json 时使用 JacksonJson 呈现这些对象。
我有两个答案,第一个建议使用不同的 getter 列表返回不同的接口,第二个建议使用 Json Views。
我理解第一种方式没有问题,但是第二种方式,在阅读了JacksonJsonViews上的文档后,我不知道如何用Spring实现它。
为了继续举例,我将在 Views 类中声明三个存根类:
// View definitions:
public class Views {
public static class Public { }
public static class ExtendedPublic extends PublicView { }
public static class Internal extends ExtendedPublicView { }
}
然后我要声明提到的类:
public class PublicView { }
public class ExtendedPublicView { }
他们到底为什么要声明空静态类和外部空类,我不知道。我知道他们需要一个“标签”,但是 Views 的静态成员就足够了。并不是ExtendedPublic 扩展Public,因为这是合乎逻辑的,但它们实际上完全不相关。
最后,bean 将通过注解指定视图或视图列表:
//changed other classes to String for simplicity and fixed typo
//in classname, the values are hardcoded, just for testing
public class Bean {
// Name is public
@JsonView(Views.Public.class)
String name = "just testing";
// Address semi-public
@JsonView(Views.ExtendedPublic.class)
String address = "address";
// SSN only for internal usage
@JsonView(Views.Internal.class)
String ssn = "32342342";
}
最后在 Spring Controller 中,我要考虑如何更改我的测试 bean 的原始映射:
@RequestMapping(value = "/bean")
@ResponseBody
public final Bean getBean() {
return new Bean();
}
它说调用:
//or, starting with 1.5, more convenient (ObjectWriter is reusable too)
objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);
所以我有一个不知从何而来的ObjectMapper 实例和一个out,它不是典型的servlet PrintWriter out = response.getWriter();,而是JsonGenerator 的一个实例,并且无法通过new 运算符获得。所以不知道怎么修改方法,这里是一个不完整的尝试:
@RequestMapping(value = "/bean")
@ResponseBody
public final Bean getBean() throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
JsonGenerator out; //how to create?
objectMapper.viewWriter(Views.Public.class).writeValue(out, new Bean());
return ??; //what should I return?
}
所以我想知道是否有人成功使用 JsonView 和 Spring 以及他/她是如何做到的。整个概念看起来很有趣,但文档似乎缺乏,示例代码也不见了。
如果不可能,我将只使用相互扩展的接口。抱歉问了这么长的问题。
【问题讨论】:
-
你为什么要自己做 JSON?设置为使用 Jackson 的 HttpMessageConverter 应该自动转换它。
-
@chrislovecnm,在我的简单示例中,我只是返回带有 ResponseBody 注释的对象或集合,Spring 会在“幕后”完成所有工作。这就是问题所在,因为它是“秘密地”进行的,所以我不知道如何向它传递参数(在我的例子中是 Views.Public.class)来改变它的行为。
标签: json spring serialization spring-mvc jackson