AEM ACS Commons通用列表编辑器超8项崩溃 Groovy修复脚本排查
AEM ACS Commons通用列表编辑器修复脚本故障排查
问题背景
- AEM ACS Commons通用列表编辑器存在添加超过8个条目即功能崩溃的已知问题,经测试手动在CRX/DE中按对应方案操作可正常修复,但自行编写的Groovy脚本运行后无修复效果。
- 故障脚本内容如下:
renameRewriterFoldersInApps(); protected void renameRewriterFoldersInApps(){ Session session = resourceResolver.adaptTo(Session.class); Workspace workspace = session.getWorkspace(); workspace.copy(originalNamePath1, renamedpath1) workspace.copy(originalNamePath2, renamedpath2) Node node1 = session.getNode(originalNamePath1) Node node2 = session.getNode(originalNamePath2) node1.remove() node2.remove() session.save() revertNamesOfRewriterFoldersInApps() } protected void revertNamesOfRewriterFoldersInApps(){ Session session = resourceResolver.adaptTo(Session.class); Workspace workspace = session.getWorkspace() workspace.copy(renamedpath1, originalNamePath1) workspace.copy(renamedpath2, originalNamePath2) Node node1 = session.getNode(renamedpath1) Node node2 = session.getNode(renamedpath2) node1.remove() node2.remove() session.save() }
脚本设计的原始逻辑:
- 执行
renameRewriterFoldersInApps():将apps目录下两个重写器文件夹复制到重命名后的目标路径,删除原路径文件夹并保存会话- 调用
revertNamesOfRewriterFoldersInApps():将重命名后的文件夹复制回原路径,删除重命名路径下的文件夹并保存会话
脚本存在的核心问题
- 关键变量未定义:脚本中直接使用
originalNamePath1、renamedpath1、originalNamePath2、renamedpath2四个路径变量,但全程未赋值实际的CRX节点绝对路径,脚本运行时会直接抛出变量缺失异常,根本未执行到实际节点操作逻辑。 - 操作选型错误,无法触发修复逻辑:手动操作能修复问题的核心,是通过「重命名文件夹再改回原名」的节点移动操作,触发Sling重写器配置监听事件,清空旧的错误缓存、重新加载正确配置。但脚本使用
workspace.copy()+删除的逻辑,本质是复制生成新节点再删除旧节点,不会触发节点移动/重命名对应的事件监听,配置缓存不会被刷新,自然没有修复效果。 - 会话管理逻辑混乱:两个方法中重复从
resourceResolver适配新的Session对象,操作过程中没有做会话状态刷新,第二次执行复制操作时,第一次操作产生的节点变更可能未被新会话感知,容易出现节点不存在、路径冲突的报错。 - 无异常回滚逻辑:如果操作中途报错,会导致重写器文件夹停留在临时路径,直接影响站点重写规则正常生效。
可直接生效的修复脚本
// 替换为你环境中实际需要操作的两个重写器节点路径 def originalConfigPath1 = "/apps/acs-commons/config/rewriter" def tempConfigPath1 = "/apps/acs-commons/config/rewriter_bak_tmp" def originalConfigPath2 = "/apps/your-site/config/rewriter" def tempConfigPath2 = "/apps/your-site/config/rewriter_bak_tmp" def session = resourceResolver.adaptTo(Session.class) try { // 第一步:移动(重命名)节点到临时路径,触发配置卸载事件 session.move(originalConfigPath1, tempConfigPath1) session.move(originalConfigPath2, tempConfigPath2) session.save() // 强制刷新会话同步节点状态 session.refresh(true) // 第二步:将节点移回原路径,触发配置重新加载 session.move(tempConfigPath1, originalConfigPath1) session.move(tempConfigPath2, originalConfigPath2) session.save() // 刷新资源解析器清空上层缓存 resourceResolver.refresh() } catch (Exception e) { // 操作异常时回滚会话,避免节点残留在临时路径 session.refresh(false) throw e }
内容的提问来源于stack exchange,提问作者Fahad Shafiq
相关产品推荐
相关产品推荐

