【问题标题】:Spring and @JsonView with multiple identifiers具有多个标识符的 Spring 和 @JsonView
【发布时间】:2016-04-04 18:52:43
【问题描述】:

Spring 从 4.1 版开始支持 @JsonView

使用具有多个标识符的 @JsonView 注释 Spring 控制器的(使用 @RestController 注释)方法我得到以下异常:

java.lang.IllegalArgumentException: @JsonView only supported for request body advice with exactly 1 class argument: org.springframework.web.method.HandlerMethod$HandlerMethodParameter@a566e37e

显然根据JsonViewResponseBodyAdviceJavadoc,以下是正确的:

请注意,尽管@JsonView 允许多个类 指定,仅支持使用响应正文建议 正是一个类论点。考虑使用复合接口。

同样,在注释控制器的方法参数(使用@RequestBody 注释)时,也使用具有多个标识符的@JsonView;根据JsonViewRequestBodyAdviceJavadoc

请注意,尽管 @JsonView 允许多个类 指定,请求正文建议的使用仅支持 正是一个类论点。考虑使用复合接口。

有人知道是否计划进行修复吗?我当前的 Spring 版本是 4.2.4。

这将非常有用为公共、私有(扩展公共)、摘要和详细(扩展摘要)视图创建 json 视图,然后将它们组合到控制器方法中!

【问题讨论】:

    标签: spring spring-mvc jackson


    【解决方案1】:

    正如Jackson JsonView documentation 中所解释的,“每个序列化只有一个活动视图;但由于视图的继承,可以通过聚合组合视图”。

    具体来说,如果你想同时使用FooBarJsonViews,定义一个FooBar接口,将它们组合如下:

    interface Foo {}
    
    interface Bar {}
    
    interface FooBar extends Foo, Bar {}
    

    然后,您可以使用 @JsonView(Foo.class)@JsonView(Bar.class) 注释您的字段,并在控制器级别使用 @JsonView(FooBar.class)

    【讨论】:

    • 感谢 Sebastien 提供的 cmets,但问题是我们可以使用继承(而不是聚合)。
    • 不太明白,能否请您详细介绍一下您的用例?
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2012-11-06
    • 2011-11-30
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2011-12-23
    相关资源
    最近更新 更多