controller
/**
@ApiOperation swagger注解,将此方法映射到swagger前端页面
@RequiresPermissions shiro权限注解,无此权限禁止访问此接口
/**
* 跳转列表页面
*/
@GetMapping("/treeList")
@ApiOperation(httpMethod = "GET", value = "菜单列表")
// @RequiresPermissions("sysResource:list")
public ApiResponse<List<ResourceVO>> treeList() {
List<ResourceVO> resources = sysResourceService.treeMainList();
return ApiResponse.success(resources);
}
service
/**
* treeList
*
* @return
*/
public List<ResourceVO> treeMainList() {
//查询主节点
List<SysResource> rootResources = sysResourceDAO.listRoot();
//准备一个list
List<ResourceVO> results = Lists.newArrayListWithExpectedSize(rootResources.size());
//循环主节点
rootResources.forEach(rootResource -> {
//准备一个实体
ResourceVO resourceVO = new ResourceVO();
//利用treeList()方法递归查询子节点,返回所有子节点,传入主节点的实体
List<ResourceVO> resources = treeList(rootResource);
//如果有子节点,放入准备好的实体
if (!resources.isEmpty()) {
resourceVO.setChildren(resources);
}
//将查询的主节点的实体的内容映射到准备好的实体
BeanUtils.copyBeanProp(resourceVO, rootResource);
//将准备的实体放入准备好的list返回
results.add(resourceVO);
});
//返回给调用者
return results;
}
public List<ResourceVO> treeList(SysResource rootResource) {
//根据主节点的实体的id当做子节点的父id查询所有子节点
List<SysResource> childrenResources = sysResourceDAO.listChildren(rootResource.getId());
//准备一个list
List<ResourceVO> result = Lists.newArrayListWithExpectedSize(childrenResources.size());
//如果查无子节点则直接返回准备好的数组,递归结束
if (childrenResources.isEmpty()) {
return result;
} else {
childrenResources.forEach(childrenResource -> {
//准备好一个实体
ResourceVO child = new ResourceVO();
//将子节点实体里其他内容映射到准备好的实体
BeanUtils.copyBeanProp(child, childrenResource);
//子节点的实体再传入本身方法再次调用,再次查询再下一级的子节点,递归调用
List<ResourceVO> subChildren = treeList(childrenResource);
//返回值放入准备好的实体
if (!subChildren.isEmpty()) {
child.setChildren(subChildren);
}
//将准备好的实体放入准备好的list
result.add(child);
});
}
//返回给调用者
return result;
}
测试有效。