使用list.contains方法比较对象未重写equals判断失败问题-爱代码爱编程
问题
如题,本次在项目中编写RBAC权限,构建动态路由菜单的时候,使用了list.contains(对象)但是未重写对象的equals方法,导致已存在对象仍被判为未存在重复添加!导致前端显示的菜单会出现重复!!!(小坑买打雷,哈哈哈)
解决
对目标类重写equals方法;
上代码
controller
/***
* 获取动态路由
*/
@GetMapping("getMenusRouters")
public AjaxResult getRoutersTwo()
{
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
// 用户信息
SysUser user = loginUser.getUser();
List<SysMenu> menus = menuService.selectMenuListForRouter(new SysMenu(), user.getUserId());
return AjaxResult.success(menuService.builderMenusRouters(menus));
}
实现类
/**
* 查询系统菜单列表
*
* @param menu 菜单信息
* @return 菜单列表
*/
@Override
public List<SysMenu> selectMenuListForRouter(SysMenu menu, Long userId) {
List<SysMenu> menuList = null;
List<SysMenu> menus = new ArrayList<>();
// 非管理员查询其关联的菜单
menuList = menuMapper.selectMenuTreeByUserId(userId);
// 分组菜单,全选的包含其父菜单,半选的未包含
Map<Long, List<SysMenu>> listMap = menuList.stream().collect(Collectors.groupingBy(SysMenu::getParentId));
menus.addAll(menuList);
// 找出半选的父菜单加入list返回
listMap.forEach((k, v) -> {
if (k == 0) {
} else {
SysMenu sysMenu = menuMapper.selectMenuById(k);
// !!! 就是这里了 !!!
if (!menus.contains(sysMenu)) {
menus.add(sysMenu);
}
}
});
// 排序
if (menus != null && menus.size() > 0) {
List<SysMenu> sysMenus = menus.stream().sorted(Comparator.comparingLong(SysMenu::getParentId).thenComparing(SysMenu::getOrderNum)).collect(Collectors.toList());
return sysMenus;
}
return null;
}
对SysMenu重写equals即可。
@EqualsAndHashCode
public class SysMenu extends BaseEntity{}