Controller方法参数多态

就是一个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);
                }
            });
发布了16 篇原创文章 · 获赞 4 · 访问量 2024

猜你喜欢

转载自blog.csdn.net/qq_36592473/article/details/104439952
今日推荐