在使用activiti框架的时候,在向后台展示页面时,会出现如下错:
首先我们分析报错原因:
产生原因是 list 转失败了
为什么失败:
这里是一个接口,必然有一个实现类,实现类中有这么一个字段:
原理分析:
他是一个懒加载对象,所以说,有一个作用域范围,在service层里面拿到数据库里面的session还在,但是到了controller已经不在了,
而此时是@ResponseBody(JSON序列化) 在调用,一旦session不在,这个懒加载对象就加载不出来了
解决方法:
map其实就是实体类,既然是个实体类,那么就可以传入一个map
代码这样写就可以了:
如果字段比较多,一次次的添加就显得很麻烦,就需要自己创建一个工具类了
@Override
public List<Map<String, Object>> queryPdList() {
// 查询对象
ProcessDefinitionQuery createProcessDefinitionQuery = repositoryService.createProcessDefinitionQuery();
// 封装的列表map 代替 实体类 ProcessDefinition (因为 ProcessDefinitionEntity
// List<IdentityLinkEntity> definitionIdentityLinkEntities 懒加载对象 )
List<Map<String, Object>> listMap = new ArrayList<>();
// 目标类
List<ProcessDefinition> list = createProcessDefinitionQuery.list();
// 循环
String[] ps = { "id", "name", "version", "key", "diagramResourceName", "resourceName", "deploymentId",
"suspensionState" };
for (ProcessDefinition pd : list) {
// Map<String, Object> map=new HashMap<>();
// map.put("id", pd.getId());
// map.put("name", pd.getName());
Map<String, Object> map = CommUtil.obj2map(pd, ps);
listMap.add(map);
}
return listMap;
}
工具类代码如下:
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.BeanUtils;
public class CommUtil {
/**
* 把指定的复杂对象属性,按照指定的内容,封装到新的map中
* @param source 目标对象
* @param ps 需要封装到map中的属性
* @return
*/
public static Map<String, Object> obj2map(Object source, String[] ps) {
Map<String, Object> map = new HashMap<>();
if (source == null)
return null;
if (ps == null || ps.length < 1) {
return null;
}
for (String p : ps) {
PropertyDescriptor sourcePd = BeanUtils.getPropertyDescriptor(
source.getClass(), p);
if (sourcePd != null && sourcePd.getReadMethod() != null) {
try {
Method readMethod = sourcePd.getReadMethod();
if (!Modifier.isPublic(readMethod.getDeclaringClass()
.getModifiers())) {
readMethod.setAccessible(true);
}
Object value = readMethod.invoke(source, new Object[0]);
map.put(p, value);
} catch (Exception ex) {
throw new RuntimeException(
"Could not copy properties from source to target",
ex);
}
}
}
return map;
}
}
希望此文章对您有所帮助,您的点赞就是对博主最大的支持.