list - 列表总是返回单个元素
问题描述
我正在研究 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;
}
解决方案
我不确定您要做什么,但我发现您的代码有几个问题:
- 您正在从列表中读取并同时对其进行修改。这就是为什么你需要清除它,这就是为什么你最终只有一个项目;
- 你没有保存任何东西,因为你只是错误地修改了一个列表,但你没有对它做任何事情。
- 您总是只返回一个权限,因为您在数组循环中有一个 return 语句。
- 如果没有权限,您将抛出 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;
}
推荐阅读
- java - 如何测试文本视图是否包含特定链接?
- python - 条件在python中工作异常:
- git - 通过 Github Actions CI/CD 访问服务器时 Git Permission denied (publickey)
- python-3.x - 如何在不同的shell中打开两个py文件
- c# - 是否可以在 C# 中执行“递归参数多态性”
- excel - Excel VBA:如何将范围转换为数字并将列中的输出作为列表
- amazon-redshift - 将子查询连接到另一个红移
- mysql - MYSQL EAV 连接查询优化
- javascript - 在 iframe 中拖放在 Spring 中不起作用
- javascript - LinkError:WebAssembly.instantiate() 函数导入需要可调用