首页 > 解决方案 > 列表总是返回单个元素

问题描述

我正在研究 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;
}

标签: listspring-bootarraylistspring-securitypermissions

解决方案


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

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

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

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;
    } 

推荐阅读