上周帮同事看一个问题,是想构造一个万能的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结构的进行传参。