Spring @ReponseBody @RequestBody with abstract class

时间:2014-11-27 12:01:26

标签: json spring jackson abstract-class

假设我有三个班级。

public abstract class Animal {}

public class Cat extends Animal {}

public class Dog extends Animal {}

我可以这样做吗?

输入: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;
}

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

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

1 个答案:

答案 0 :(得分:32)

ref link

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

我所做的是在抽象类

之上添加了一些代码
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{}

然后在HTML中的json输入中,

var inputjson = {
    "type":"cat",
    //blablabla
};

提交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;
}

在这种情况下,变量tmp会自动转换为DogCat对象,具体取决于json输入。