问题描述:在采用DirectJNgine来完成前端ExtJS4和Java后台数据交互过程中,出现以下问题:前端通过ExtJS框架的DirectStore从后台请求数据,由于Store请求数据的格式基本不变,大概由以下字段构成:请求是成功的标志,记录总条数,返回到前端的数据(通常是一个集合)。对于这个集合,首先想到是泛型,泛化的类型为返回到前端的Model。所以,DirectMethod通常是以下形式:
/**
* 用户列表. */
@DirectMethod
public DataStore<User> list(int start, int limit, String sort, String dir) {
List<User> users = new Vector<Users>(); //添加一些user
return new DataStore<User>(this.users.size(), users, true);
}
DataStore为:
public class DataStore<T> {
/**
* 包含数据集合的属性名, 默认为空.
* <p>
* 约定前端data.Reader的包含数据集合的属性名(root属性)为data.
* </p>
*/
private List<T> data;
/**
* 记录总条数.
* <p>
* 前端data.Reader的记录总条数totalProperty的属性名称默认为total.
* </p>
*/
private int total;
/**
* 指示请求是否成功.
* <p>
* 默认为成功.
* </p>
*/
private boolean success = true;
// 构造方法,以及getters和setters...
}
我觉得这是一个看上去比较完美的的模型。但是在使用的过程中,后端会抛以下异常:
java.lang.UnsupportedOperationException: Expecting parameterized type
Are you missing the use of TypeToken idiom?
See http://sites.google.com/site/gson/gs...ializing-Gener
at com.google.gson.TypeInfoFactory.getActualType(TypeInfoFactory.java:97)
原因是Gson不能正确解析DataStore<User>。经过做一些实验,验证如果返回的是泛型,而且类内部有使用泛型实例,则Gson解析通不过。实验请参看帖子Ext Direct Java based implementation #395 .
分析:通过Gson是可以解析泛型的,方法是把泛型的实际类型传给fromJson方法,如:
DataStore<User> usersStore = new DataStore<User>();
// 添加 users 到usersStore
Type listType = new TypeToken<DataStore<User>() {}.getType();
gson.toJson(myStrings, listType);
但是DJN当前还没有完美得解决这个问题,作者的建议是尽量不要采用泛型作为返回值。DJN作者的解释的见Ext Direct Java based implementation #396 。由于DJN处理Json的宗旨”尽量避免Json序列化的工作”的限制,很多功能还不能完美的解决,比如说循环引用,属性排除等,这在一定程度上消弱了Gson本身的功能。关于这方面的问题,我还会继续和作者沟通,看看在将来的版本能否有一个好的解决方案。最新动态请关注上面的帖子和DJN的官网。
解决方案:我最终将DataStore类设计为以下形式:
/**
* 返回到前端的数据仓库.
* <p>
* 用户返回给前端Store的请求.
* <p>
*
* @author feiq
*
*/
public class DataStore {
public DataStore() {
}
@SuppressWarnings("rawtypes")
public DataStore(int total, List data) {
this.total = total;
this.data = data;
}
@SuppressWarnings("rawtypes")
/**
* 包含数据集合的属性名, 默认为空.
* <p>
* 约定前端data.Reader的包含数据集合的属性名(root属性)为data.
* </p>
*/
private List data;
@SuppressWarnings("rawtypes")
public DataStore(int total, List data, boolean success) {
this.total = total;
this.success = success;
this.data = data;
}
/**
* 记录总条数.
* <p>
* 前端data.Reader的记录总条数totalProperty的属性名称默认为total.
* </p>
*/
private int total;
/**
* 指示请求是否成功.
* <p>
* 默认为成功.
* </p>
*/
private boolean success = true;
// getters and setters...
}
这样既可以避免泛型序列化的问题,也可以避免继承泛型类的大量子类,如
class UsersStore extends DataStore<User>{
// ...
}
分享到:
相关推荐
C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON
又小又快又无依赖Json序列化与反序列化 eg: 1.json序列化 String json=JsonUtil.instance().obj2Json(obj); 2.json反序列化(Object表示具体的类) Object obj=JsonUtil.instance().json2Obj(json,Object.class) ...
Unity5json解析工具,支持android/ios泛型列表参数正反序列化,unity5.x工程导入即可用
理解.net反射 泛型 序列化 的精美PPT
net基础——泛型PPT教案学习.pptx
主要介绍编写高质量的代码有助于改善C#程序,在开发过程中集合用的比较多,如何把集合使用好,在开发过程必须掌握的技巧,下面这篇文章就给大家详细介绍编写高质量代码改善C#程序——使用泛型集合代替非泛型集合...
gson 解析泛型和将泛型转为json字符串
json字符串转化为list泛型的源码demo,项目中包括需要运行的jsonjar包
博客《夯实JAVA基本之一——泛型详解(1)》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/49872903
多层嵌套的JSON字符串也可以解析,泛型T的属性要和JSON字符串反序列化的对象属性一致。
第14章元素增删检索——集合与泛型.ppt
C 设计新思维——泛型编程与设计范式之应用 PDF,候捷译序。㆒般人对C templates 的粗略印象,大约停留在「容器(containers)」的制作上。稍有研究由会发现,templates衍生出来的C Generic Programming(泛型编程)技术...
博客《夯实JAVA基本之一——泛型详解(2)》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/49883589
主要介绍了c#泛型序列化对象为字节数组的示例,需要的朋友可以参考下
标准库为容器类型定义的操作很少...所谓“泛型”是指这些算法可以应用于多种容器类型上,而容器内的元素类型也可以多样化。标准库提供了100多个泛型算法,主要定义于头文件中,还有一组泛化的算术算法定义于头文件中。
Dictionary序列化源码 datatable序列化源码 文件反序列化为泛型数组 序列化泛型数组为xml文件 值得下载 源码可以运行
很多初学C#编程的人可能对泛型列表List的使用不是很清楚,希望这个例子能帮助大家.
java 一个关于泛型的简单例子 java 一个关于泛型的简单例子 java 一个关于泛型的简单例子