就是一个jackjson反序列化。
1、先定义接口/父类并
2、@JsonTypeInfo 标明反序列化规则。@JsonSubTypes标明实现类/子类
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "typeName")
@JsonSubTypes({
@JsonSubTypes.Type(value = IcRetailLicense.class, name = "IcRetailLicense"),
@JsonSubTypes.Type(value = IcPartyInfo.class, name = "IcPartyInfo"),
@JsonSubTypes.Type(value = IcExpressPhone.class, name = "IcExpressPhone"),
})
public interface DataSourceEntityAbstract {
}
@JsonTypeInfo注解中设置了 use = JsonTypeInfo.Id.NAME 指定名称 include = JsonTypeInfo.As.EXTERNAL_PROPERTY 作为额外的扩展属性
property = "typeName" 识别码名为typeName
@JsonSubTypes中是一个@JsonSubTypes.Type数组,value为所要向下转型的子类,name为@JsonTypeInfo中propert="typeName"的值
类似 typeName = IcRetailLicense
从页面传参时json中应该是 typeName属性值为要反序列化的子类,如{typeName:IcRetailLicense}
在controller接受参数时会讲json字符串反序列化为typeName指定的DataSourceEntityAbstract接口的子类,
接着Controller中方法
@RequestMapping("/query/{service}")
@ResponseBody
public List<?> queryDataSource(@PathVariable("service") String service,@RequestBody DataSourceEntityAbstract dataSourceEntityAbstract){
IcDataSourceService icDataSourceService =
(IcDataSourceService)SpringContextUtils.getBean(service);
return icDataSourceService.queryDataSource(dataSourceEntityAbstract);
}
@RequestBody的反序列化使用的是jackjson,反序列化的对象要有@RequestBody注解。
最后js:
$.ajax({
type:"post",
url:"/dataSource/query/icRetailLicenseServiceImpl",
dataType:"json",
data:(function(){
var data = {};
data["typeName"] = "IcRetailLicense";
var formdata = $("#queryForm").serializeArray();
for(var index in formdata){
data[formdata[index].name]=formdata[index].value?formdata[index].value:null;
}
return JSON.stringify(data);
})(),
contentType:"application/json",
cache:false,
error:function(status,exception){
$.messager.alert("错误","查询失败","error");
},
success:function(data,status){
query(data);
}
});