今天在写EJB服务端代码,(ˇˍˇ) 想在客户端与服务器之间通过Json传List<User>对象,出现如下错误,并给出我自己的解决方法
1.服务端---无法将List对象转为String,正常的List都可以转的
Gson gson=new Gson();
List<User> users=query.getResultList();
return gson.toJson(users);
原因:网上说User对象中存在Lazy懒加载设置,设为EAGER即可,但我试了下对我的代码不起作用
解决方案:
使用自定义的gson配置,不使用默认的,如何配置请看博客相关文章。
<span style="color:#FF0000;">Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(User.class, new MyTypeAdapter<User>()).create();</span>
List<User> users=query.getResultList();
return gson.toJson(users);
<span style="color:#FF0000;">MyTypeAdapter类文件
</span>
public class MyTypeAdapter<T> extends TypeAdapter<T> {
public T read(JsonReader reader) throws IOException {
return null;
}
public void write(JsonWriter writer, T obj) throws IOException {
if (obj == null) {
writer.nullValue();
return;
}
writer.value(<span style="color:#FF0000;">obj.toString()</span>);
}
}
这样服务端String对象就可以传到客户端了
2.值可以传了但是,传过来的不是json格式的--[bean.user@sadasd,bean.user@123123123],导致客户端使用如下代码无法转为User
Type type = new TypeToken<ArrayList<User>>(){}.getType();
List<User> us=new ArrayList<>();
us=gson.fromJson(users, type);
原因:是因为服务器端自己配置的gson--obj.toString()
解决方法:重新User的toString()方法
@Override
//[{"userId":0,"name":"fh","ip":"1","value":1},{"userId":0,"name":"fh1","ip":"1","value":1}]
public String toString() {
return "{userId:" + userId + ", name:" + name + ", ip:" + ip
+ ", value:" + value+"}" ;
}
这样就可以得到正确的json格式,就可以成功转换为User