SpringMVC中关于FastJson泛型对象的转换问题
程序员文章站
2022-06-07 13:13:20
...
上周帮同事看一个问题,是想构造一个万能的query对象,这个对象里面包含一个泛型的对象,在spring mvc的controller层想通过RequestBody直接进行转换,spring mvc的代码如下:
@RequestMapping("/testBind") @ResponseBody public String testBind(@RequestBody MgQueryCondition<TestBean> queryCondition){ System.out.println(queryCondition); return "success"; }
import java.io.Serializable; public class TestBean implements Serializable{ private Integer id; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Override public String toString() { return "TestBean [id=" + id + "]"; } }
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; public class MgQueryCondition<T> { private T model; private Integer pageNo; private Integer pageNum; public T getModel() { return model; } public void setModel(T model) { this.model = model; } public Integer getPageNo() { return pageNo; } public void setPageNo(Integer pageNo) { this.pageNo = pageNo; } public Integer getPageNum() { return pageNum; } public void setPageNum(Integer pageNum) { this.pageNum = pageNum; } @Override public String toString() { return "MgQueryCondition [model=" + model + ", pageNo=" + pageNo + ", pageNum=" + pageNum + "]"; } }
假设我们去调试的话,发现MgQueryCondition里面的数据类型是JSONObject,如果如果在调用getModel的时候就会发生类型转换问题,后来我看了下fastjson的文档。
针对泛型类型,使用TypeReference进行解析,代码如下:
public static void main(String[] args) { MgQueryCondition<TestBean> test = new MgQueryCondition<TestBean>(); TestBean testBean = new TestBean(); testBean.setId(1); test.setModel(testBean); test.setPageNo(1); test.setPageNum(1); System.out.println(JSONObject.toJSONString(test)); String json = "{\"model\":{\"id\":1},\"pageNo\":1,\"pageNum\":1}"; MgQueryCondition<TestBean> clazz = JSON.parseObject(json, new TypeReference<MgQueryCondition<TestBean>>(){}); System.out.println(clazz.getModel().getClass()); }
这样我们就无法使用@RequestBody了,所以应该使用最基本的kv结构的进行传参。