在做用户菜单权限的时候(因为多张表关联外键,hibernate返回回去会出现无限循环),所以把他转换成和数据库无关的VO类即可
一 、VO类如下
**
*
*
* 封装菜单的树形结构
* @author 六松岛福小林
*
**/
public class MenuTree implements java.io.Serializable {
/**
* 树形节点id
*/
private String id;
/**
* 菜单级别 0为第一级菜单,1为第二级菜单……
*/
private String level;
/**
* 父级树形id
*/
private String parentId;
/**
* 树形节点名称
*/
private String name;
/**
* 对应的菜单图片路径
*/
private String imagePath;
/**
* 菜单对应的url地址
*/
private String url;
/**
* 子节点list
*/
private List<MenuTree> children;
……对应的Getter和Setter 这个在此省略……
}
二、封装的树形工具类如下
备注:循环和递归使用任何一种即可
/**
* 两层循环实现建树
* @param menuTrees 传入的树节点列表
* @return List<MenuTree> 子节点集合
*/
public static List<MenuTree> build(List<MenuTree> menuTrees) {
//返回的树形结构数据
List<MenuTree> trees = new ArrayList<>();
//循环菜单树形数据
for (MenuTree menuTree : menuTrees) {
//菜单级别为0,则是一级数据,根据实际情况判断可修改相关关联判断
if("0".equals(menuTree.getLevel())){
trees.add(menuTree);
for (MenuTree it : menuTrees) {
//找出一级菜单下面的所有二级菜单,并加入到list中去
if (menuTree.getId().equals(it.getParentId())) {
if (menuTree.getChildren() == null) {
menuTree.setChildren(new ArrayList<MenuTree>());
}
menuTree.getChildren().add(it);
}
}
}
}
return trees;
}
/**
* 使用递归方法建树
* @param menuTrees 子节点集合
* @return List<MenuTree>
*/
public static List<MenuTree> buildByRecursive(List<MenuTree> menuTrees) {
List<MenuTree> trees = new ArrayList<>();
for (MenuTree menuTree : menuTrees) {
//菜单级别为0,则是一级数据,根据实际情况判断可修改相关关联判断
if ("0".equals(menuTree.getLevel())) {
trees.add(findChildren(menuTree,menuTrees));
}
}
return trees;
}
/**
* 递归查找子节点
* @param menuTree 菜单数对象
* @param menuTrees 子节点
* @return MenuTree
*/
private static MenuTree findChildren(MenuTree menuTree,List<MenuTree> menuTrees) {
for (MenuTree it : menuTrees) {
if(menuTree.getId().equals(it.getParentId())) {
if (menuTree.getChildren() == null) {
menuTree.setChildren(new ArrayList<MenuTree>());
}
menuTree.getChildren().add(findChildren(it,menuTrees));
}
}
return menuTree;
}
三、调用
/** *根据用户id返回菜单的树形数据 * @param userId 用户的id * @param systemService 操作数据库的service * @return 封装好的菜单树形数据 */
public static List<MenuTree> getMenuTreeList(String userId, SystemService systemService) throws Exception{
//查询该用户所有的菜单数据
List<Map<String, Object>> menuDataList = getMenuDataList(userId, systemService);
//封装成菜单对象list
List<MenuTree> menuList = getMenuList(menuDataList);
//调用封装树形数据方法
return TreeBuilder.build(menuList);
}
仍在不断学习中,如有不妥还望各位大神留言指教
代码下载地址 在下一篇根据用户查询相关菜单的博客中