jackson实现多态解析
类结构:
接口类:Criteria
public interface Criteria {
//自己的接口
}
实现类1:AndCriteria
@Data
public class AndCriteria implements Criteria {
//实现的接口
}
实现类2:OrCriteria
@Data
public class OrCriteria implements Criteria {
//实现的接口
}
场景
controller层有一个接口
public void Xxxx(@RequestBody Criteria criteria){
//自己的代码
}
此时直接接收会报错如下:
exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of Criteria : abstract types either need to be mapped to concrete types, have custom deserializer
解决方案
使用jackson的@JsonSubTypes注解
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type" //传递参数必备的字段
)
@JsonSubTypes({
//@JsonSubTypes.Type指定所有子类
@JsonSubTypes.Type(value = AndCriteria.class, name = "AND"),
@JsonSubTypes.Type(value = OrCriteria.class, name = "OR")
})
public interface Criteria {
}
JsonTypeInfo.As.PROPERTY:type做为请求报文字段带入,值就是下边定义的AND、OR。要是不存在对应类型会报异常。此处还有其他的类型可以搜一下,常用的还是这个。报文如下格式:
{
"criteria":{
"type":"AND"
},
xxxx:xxxx //其他的字段
}