java 解決實體類序列化時,報failed to lazily initialize 的問題
具體報錯信息:
org.codehaus.jackson.map.JsonMappingException: failed to lazily initialize a collection of role: com.girltest.entity.Test2Boy.conventions, could not initialize proxy - no Session (through reference chain: java.util.HashMap["recordList"]->java.util.ArrayList[0]->com.girltest.entity.Test2Boy["conventions"])
原因:因爲實體類中有hibernate懶加載的成員變量
解決方法:
json序列化之前 ,把懶加載的成員變量設置爲null
/***
* get all field ,including fields in father/super class
*
* @param clazz
* @return
*/
public static List<Field> getAllFieldList(Class<?> clazz) {
if (clazz == null) {
return null;
}
List<Field> fieldsList = new ArrayList<Field>();// return object
Class<?> superClass = clazz.getSuperclass();// father class
if(ValueWidget.isNullOrEmpty(superClass)){
return null;
}
if (!superClass.getName().equals(Object.class.getName()))/*
* java.lang.Object
*/{
// System.out.println("has father");
fieldsList.addAll(getAllFieldList(superClass));// Recursive
}
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
// 排除因實現Serializable 接口而產生的屬性serialVersionUID
if (!field.getName().equals("serialVersionUID")) {
fieldsList.add(field);
}
}
return fieldsList;
}
/***
* 過濾hibernate懶加載的成員變量<br />
* org.codehaus.jackson.map.JsonMappingException: failed to lazily initialize a collection of role: com.girltest.entity.Test2Boy.conventions, could not initialize proxy - no Session (through reference chain: java.util.HashMap["recordList"]->java.util.ArrayList[0]->com.girltest.entity.Test2Boy["conventions"])
*
* @param obj
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static void skipHibernatePersistentBag(Object obj)
throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
if (obj == null) {
return;
}
List<Field> fieldsList = getAllFieldList(obj.getClass());
if (ValueWidget.isNullOrEmpty(fieldsList)) {
return;
}
for (int i = 0; i < fieldsList.size(); i++) {
Field f = fieldsList.get(i);
Object vObj = getObjectValue(obj, f);
if (null != vObj && vObj.getClass().getName().equals("org.hibernate.collection.internal.PersistentBag")) {
f.setAccessible(true);
f.set(obj, null);
}
}
}
try {
ReflectHWUtils.skipHibernatePersistentBag(object);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}