Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将@JsonView与Spring MVC结合使用_Java_Json_Spring_Spring Mvc_Jakarta Ee - Fatal编程技术网

Java 将@JsonView与Spring MVC结合使用

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定义使我的spring应用程序使用JSON说话

<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);
}