You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
}

脚本设计的原始逻辑:

  1. 执行renameRewriterFoldersInApps():将apps目录下两个重写器文件夹复制到重命名后的目标路径,删除原路径文件夹并保存会话
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:06:28