列表始终返回单个元素

时间:2019-09-17 07:32:19

标签: list spring-boot arraylist spring-security permissions

我正在研究Spring Security。我有一个从另一个方法调用的方法。被调用的方法应该返回一个包含多个元素的列表,但是我总是发现它只返回列表中的单个元素。

一个例子是:我有 权限:CREATE_EDITOR,EDIT_EDITOR,CREATE_PROFILE,EDIT_PROFILE。

角色:ROLE_EDITOR,ROLE_PROFILE

该权限是第一个创建的权限,在创建ROLES时,它将遍历PERMISSIONS,并仅返回与ROLE匹配的PERMISSIONS。

就像循环在保存角色之前只运行一次。如何保存所有与角色匹配的权限?

返回权限的方法

private List<Permission> myPermissions(Role role ){
        List<Permission> permissionArrayList = new ArrayList<Permission>();
        permissionArrayList = permissionRepository.findAll();
        String myRole = role.getName().split("_")[1];
        for (Permission permission: permissionArrayList) {
            if ( permission.getName().contains(myRole) ) {
                permissionArrayList.clear();
                permissionArrayList.add(permission);
                return permissionArrayList;
            }
        }
        throw new InternalServerException();
    }

保存ROLE的方法

public Role save(Role role) {
    Role myRole = new Role();
    myRole.setName(role.getName());
    myRole.setPermissions(myPermissions(role));
    roleRepository.save(myRole);
    return myRole;
}

2 个答案:

答案 0 :(得分:0)

我不确定您要做什么,但是我发现您的代码有几个问题:

  1. 您正在从列表中读取并同时对其进行修改。这就是为什么您需要清除它,也就是为什么最终只有一项;
  2. 您没有保存任何内容,因为您只是错误地修改了列表,但并未对其进行任何操作。
  3. 由于数组循环中有一个return语句,因此您总是只返回一个权限。
  4. 如果没有权限,则抛出InternalServer Exception,这似乎是错误的。

以以下方式修改方法将解决您正在寻求帮助的问题,如果您的save方法运行正常(例如,您应检查返回的权限对象是否为空)。但是,我建议您事后查看需求并重构代码。

private List<Permission> myPermissions(Role role ){
        List<Permission> permissions = permissionRepository.findAll();
        List<Permission> permissionsToSave = new ArrayList<Permission>();
        String myRole = role.getName().split("_")[1];
        for (Permission permission: permissions ) {
            if ( permissions.getName().contains(myRole) ) {
                permissionsToSave.add(permission);
            }
        }
        return permissionsToSave;
    } 

答案 1 :(得分:0)

我非常感谢@ AR1和@M。 Deinum。最终,我必须将迭代包装在保存(提交)到数据库的main方法中。这种情况的解释是,当迭代方法被分离时,它仅被调用一次,从而只保存了一个匹配的权限对象。

help