从Rest Controller返回对象层次结构时如何使用Spring MVC @JsonView

Pat*_*one 10 java rest spring json spring-mvc

我正在构建一个使用Spring MVC 4.10和jackson 2.3.2的应用程序.我有一个Project类,它有子Proposal对象和Customer对象.这些Proposal对象很复杂,我想返回它们的汇总JSON视图.Customer对象也会发生类似的情况.我正在尝试用@JsonView注释实现它.

我想问一下,在容器对象类视图中扩展成员对象类的视图是否是这样做的方法,如果没有,是否有更清晰的方法来实现这个我不知道的.

上下文

在今天之前,我的错误印象是您可以使用多个视图注释您的控制器,并且相应地过滤生成的JSON表示.

@JsonView({Project.Extended.class, Proposal.Summary.class, Customer.Summary.class})
@Transactional
@RequestMapping(value="/project", method=RequestMethod.GET)
public @ResponseBody List<Project> findAll() {
    return projectDAO.findAll();    
}
Run Code Online (Sandbox Code Playgroud)

每个类都有自己的JsonView注释和接口,例如:

public class Customer {
    ...
    public interface Summary {}
    public interface Normal extends Summary {}
    public interface Extended extends Normal {}
}
Run Code Online (Sandbox Code Playgroud)

尽管如此,它只是阵列中的第一个视图被考虑在内.根据https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring

只能使用@JsonView批注指定一个类或接口,但您可以使用继承来表示JSON视图层次结构(如果字段是JSON视图的一部分,它也将是父视图的一部分).例如,此处理程序方法将序列化使用@JsonView(View.Summary.class)和@JsonView(View.SummaryWithRecipients.class)注释的字段:

以及http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-jsonview中的官方文档

要将它与@ResponseBody控制器方法或返回ResponseEntity的控制器方法一起使用,只需添加带有类参数的@JsonView批注,该类参数指定要使用的视图类或接口:

所以,我最终在容器对象的视图中扩展了成员的视图,就像这样

@Entity
public class Project {
    ...
    public static interface Extended extends Normal, Proposal.Extended {}
    public static interface Normal extends Summary, Customer.Normal {}
    public static interface Summary {}
}
Run Code Online (Sandbox Code Playgroud)

并将我的控制器更改为此

@JsonView(Project.Extended.class)
@Transactional
@RequestMapping(value="/project", method=RequestMethod.GET)
public @ResponseBody List<Project> findAll() {
    return projectDAO.findAll();    
}
Run Code Online (Sandbox Code Playgroud)

这似乎可以解决问题,但我找不到关于这种情况的文档或讨论.这是JsonViews的预期用途还是有点hackish?

先感谢您

-Patricio Marrone

Dav*_*idA 5

我相信您已经根据需要配置了视图。问题的根源不是Spring的@JsonView,而是Jackson的视图实现。如Jackson的查看文档所述

每个序列化只有一个活动视图;但由于继承了视图,因此可以通过聚合来合并视图。

因此,看来Spring只是在继续并遵循Jackson 2设定的限制。