Java 将@JsonView与Spring MVC结合使用
我使用下面的bean定义使我的spring应用程序使用JSON说话Java 将@JsonView与Spring MVC结合使用,java,json,spring,spring-mvc,jakarta-ee,Java,Json,Spring,Spring Mvc,Jakarta Ee,我使用下面的bean定义使我的spring应用程序使用JSON说话 <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 使用此消息转换器bean是否可以使用@JsonView注释?@JsonView从v1.4开始就在Jackson JSON处理器中 新编辑:为Jackson 1.9.12更新
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
使用此消息转换器bean是否可以使用@JsonView注释?@JsonView
从v1.4开始就在Jackson JSON处理器中
新编辑:为Jackson 1.9.12更新
根据v1.8.4,我使用的writeValueUsingView
函数现在已被弃用改用ObjectMapper.viewWriter(java.lang.Class)…但是从1.9开始,它也被弃用了,改用writerWithView(Class)!(见v1.9.9)
下面是一个更新的示例,用Spring 3.2.0和Jackson 1.9.12测试,它只返回{id:1}
,而不是扩展的{name:“name”}
,因为它使用.writerWithView(Views.Public.class)
。切换到Views.extendedpublic.class
将导致{“id”:1,“name”:“name”}
上一次编辑:您需要实例化ObjectMapper
并使用自定义视图写出对象,如图所示,或者在本例中:
定义视图:
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>=1.7,您可能会发现它更适合您的需要。@JsonView注解在Spring上不受支持,但是这个问题已经解决了
跟随 添加对Jackson序列化视图的支持 SpringMVC现在支持Jackon的序列化视图进行渲染 来自不同控制器的同一POJO的不同子集 方法(例如,详细页面与摘要视图)。 问题:SPR-7156 这是最新的 状态:已解决 说明 Jackson的JSONView注释允许开发人员控制序列化方法的哪些方面。在当前实现中,必须使用Jackson视图编写器,但内容类型不可用。如果作为RequestBody注释的一部分,可以指定JSONView,那就更好了 可在
谢谢春天 是的,但是制图员怎么知道要渲染哪个视图呢?我想制图员不知道。你必须自己写这个对象。我已经编辑了我的答案,但还添加了一个指向
@JSONFilter
的链接,这可能对您更有利。因为我的答案中的例子总是写JSON格式的输出。如果您需要支持其他输出格式,这将不适用于您。请投票支持这项新功能:@Premier在我尝试帮助您之前,需要更多信息。哪个部分不工作?你用的是哪个版本的杰克逊?你到底有什么问题?我在SpringMVC中使用Jackson JSON 1.9.12。我用json字段创建了一个dto。我想要两个具有不同字段的相同dto的概要文件,因此我创建了两个接口,并使用@JsonView注释对字段进行了注释。在controller中,我使用您的代码和objectmapper在json字符串中编写dto,但没有应用过滤器,所有字段都插入json字符串。仅供参考,我最终编写了自己的视图
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);
}