Spring @ReponseBody @RequestBody with abstract class

tl1*_*231 21 spring json abstract-class jackson

假设我有三个班级.

public abstract class Animal {}

public class Cat extends Animal {}

public class Dog extends Animal {}
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?

输入:json,它是Dog或Cat

输出:狗/猫取决于输入对象类型

我不明白为什么以下代码不起作用.或者我应该使用两种不同的方法来处理新的狗和猫?

@RequestMapping(value = "/animal", method = RequestMethod.POST, produces = "application/json; charset=utf-8")
private @ResponseBody <T extends Animal>T insertAnimal(@RequestBody T animal) {
    return animal;
}
Run Code Online (Sandbox Code Playgroud)

更新:sry我忘记包含错误消息

HTTP状态500 - 请求处理失败; 嵌套异常是java.lang.IllegalArgumentException:无法解析类型变量'T'

tl1*_*231 40

ref链接

我自己找到了答案,这里是参考链接.

我所做的是在抽象类之上添加一些代码

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.*;

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

然后在HTML中的json输入中,

var inputjson = {
    "type":"cat",
    //blablabla
};
Run Code Online (Sandbox Code Playgroud)

提交json后最后在控制器中,

@RequestMapping(value = "/animal", method = RequestMethod.POST, produces = "application/json; charset=utf-8", consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody insertanimal(@RequestBody Animal tmp) {
    return tmp;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,变量tmp会自动转换为a DogCatobject,具体取决于json输入.

  • 有没有办法在猫或狗上加一些注释,而不用在动物上加@JsonSubTypes? (4认同)