Spring @RequestBody包含不同类型的列表(但是相同的接口)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring @RequestBody包含不同类型的列表(但是相同的接口)相关的知识,希望对你有一定的参考价值。

假设我有一个域类:

    public class Zoo{
        private List<Animal> animals;
        ....

其中Animal是具有不同实现的接口(Cat,Dog)。假设我希望能够保存Zoo对象:

    @RequestMapping(value = "/zoo", method = RequestMethod.POST)
    public @ResponseBody void save(@RequestBody Zoo zoo) {
    ....

我想发送一个json - 类似于:

    {
        animals:[
            {type:'Cat', whiskers-length:'3'},
            {type:'Dog', name:'Fancy'}
        ]
    }

当键入=='Cat'时,如何告诉spring MVC将动物映射到Cat类型,并在键入=='Dog'时将其映射到Dog类?

答案

您应该使用Jackson注释@JsonTypeInfo@JsonSubTypes来实现多态json。注释在Animal基类上进行。

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = Dog.class, name = "Dog"),
        @JsonSubTypes.Type(value = Cat.class, name = "Cat")})
public abstract class Animal {

}
另一答案

现在有一个更简单的注释:

@JsonRootName("dog")
public class Dog extends Animal {...}

可以在fasterxml.github上找到对注释的引用

以上是关于Spring @RequestBody包含不同类型的列表(但是相同的接口)的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解

不支持 Spring Rest POST Json RequestBody 内容类型

Spring Boot + Swagger + Swagger UI 和 @RequestBody 具有数据类型 String

带有可能需要的对象字段的 Spring 启动 RequestBody

Spring中的注解 @RequestBody和@ResponseBody的使用和区别

spring @RequestBody 和 @RequestParams 同时使用