【问题标题】:List always return a single element列表总是返回单个元素
【发布时间】:2019-09-17 07:32:19
【问题描述】:

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

【问题讨论】:

  • 当然它只会包含一个,您在添加新元素之前会删除所有内容。你觉得 .clear 收藏点怎么样?
  • @M.迪南。谢谢。我试图清除它之前保存的整个实体,忘记了它会清除最后插入的元素。
  • 它不会清除最后插入的元素,它会清除整个列表,无论其中有什么。
  • 如果我没有清除列表,它会将所有权限添加到新创建的角色,无论它是否匹配。

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


【解决方案1】:

我不确定您要做什么,但我发现您的代码存在一些问题:

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

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

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

【讨论】:

    【解决方案2】:

    我非常感谢@AR1 和@M。迪南。归根结底,我必须将迭代包装在保存(提交)到数据库的主要方法中。场景的解释是,迭代方法在分离的时候只被调用了一次,使得它只保存一个匹配的权限对象。

    List<Permission> myPermission = new ArrayList<Permission>();
                for ( Permission permission : permissionRepository.findAll()) {
                    if (permission.getName().contains(role.getName().split("_")[1])) {
                        myPermission.add(permission);
                        myRole.setName(role.getName());
                        myRole.setPermissions( myPermission );
                        roleRepository.save(myRole);
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2017-08-23
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多