如何使用Java向MongoDB现有数组添加字符串(Minecraft插件故障修复)
问题根因
你当前代码不生效的核心问题是getPermissions()方法返回的是全新生成的临时List对象,并非Profile类内部存储自定义权限的this.permissions成员本身。你往这个临时汇总列表中添加元素,不会修改对象本身持有的权限数组,执行save操作时自然不会把新权限写入MongoDB。
getPermissions()方法的设计初衷是将用户自定义权限、身份组权限、继承权限合并后返回汇总的完整权限列表,本身就不支持直接修改源数据。
修复步骤
- 首先在Profile类中新增一个专门用来添加自定义权限的方法:
// 添加到Profile类中 public void addCustomPermission(String permission) { String lowerPermission = permission.toLowerCase(); // 先判重避免重复存储相同权限 if (!this.permissions.contains(lowerPermission)) { this.permissions.add(lowerPermission); } }
- 修改命令执行逻辑,替换原来的错误添加方式:
@Command(names = {"profile addpermission"}, permission = "atmosphere.profile.admin") public static void profileAddPermission(CommandSender sender, @Param(name = "target") Profile target, @Param(name = "permission") String permission){ String lowerPerm = permission.toLowerCase(); if(target.hasPermissionPriorToLogin(lowerPerm)){ sender.sendMessage(BukkitChat.format("&c目标用户已经拥有该权限。")); return; } // 替换原来的target.getPermissions().add逻辑 target.addCustomPermission(lowerPerm); target.save(); sender.sendMessage(BukkitChat.format("&a已成功将权限 &r" + lowerPerm + "&r &a添加到用户 &r" + target.getDisplayName() + "&r&a 的配置中。")); }
修改完成后重新编译插件运行即可,新添加的权限会直接写入Profile类的permissions成员,save时会同步到MongoDB的对应数组字段中。
内容的提问来源于stack exchange,提问作者Jack Stanford
相关产品推荐
相关产品推荐

