AEM中调试javax.jcr.observation.EventListener触发异常问题
问题描述
现有AEM JCR监听代码,预期在Event.PROPERTY_CHANGED与Event.PROPERTY_ADDED事件触发时进入onEvent方法断点,但目前未生效。相关信息如下:
- PDF资产路径:
/content/dam/files/careers/factsheets/Recruitment-Q-and-A-Factsheet.pdf,其jcr:content节点类型为dam:AssetContent - 编辑PDF元数据时,属性所在父路径为
/content/dam/files/careers/factsheets/Recruitment-Q-and-A-Factsheet.pdf/jcr:content/metadata activate方法中session = commonService.getSession()的断点在AEM启动时可正常触发,无异常- 执行修改PDF元数据、发布PDF、在
/content/dam/files/careers下创建nt:unstructured和nt:folder节点等操作,均未触发onEvent内断点,已尝试调试本地author和publisher实例
相关代码:
protected void activate() { try { session = commonService.getSession(); //第三方自定义服务 observationManager = session.getWorkspace().getObservationManager(); final String[] types = { "dam:Asset", "dam:AssetContent", "nt:unstructured", "nt:folder" }; final String path = "/content/dam/files"; final int events1 = Event.PROPERTY_CHANGED | Event.PROPERTY_ADDED | Event.NODE_ADDED; observationManager.addEventListener(this, events1, path, true, null, types, false); } catch(Exception e) { log.error("bad stuff happened",e); } } @Override public void onEvent(EventIterator eventIterator) { while (eventIterator.hasNext()){ Event event = eventIterator.nextEvent(); //insert more code here } }
排查与修复方案
补充监听节点类型
编辑元数据时,实际修改的是dam:Metadata类型的节点(jcr:content/metadata),当前代码的types数组未包含该类型,导致属性变更事件被过滤。需将"dam:Metadata"添加到types数组中:final String[] types = { "dam:Asset", "dam:AssetContent", "dam:Metadata", "nt:unstructured", "nt:folder" };验证Session权限
确认commonService.getSession()返回的JCR Session具备足够权限:- 需拥有
/content/dam/files路径下的jcr:read权限,否则无法监听该路径下的节点事件 - 若使用普通用户Session,可能因会话过期导致监听失效,建议使用具备持久权限的系统用户Session
- 需拥有
检查监听注册参数
- 确认
addEventListener的第7个参数(isDeep)设为true,当前代码已正确设置,确保能监听子路径下的所有节点事件 - 若需监听发布操作的事件,需确认publisher实例上该服务已正确激活,且Session配置与author一致
- 确认
添加日志排查
在onEvent方法开头添加日志输出,确认是否有事件被触发但断点未命中(如调试器未正确附加):@Override public void onEvent(EventIterator eventIterator) { log.info("Received {} events", eventIterator.getSize()); while (eventIterator.hasNext()){ Event event = eventIterator.nextEvent(); log.info("Event type: {}, path: {}", event.getType(), event.getPath()); //insert more code here } }确认事件类型覆盖
当前代码监听了Event.PROPERTY_CHANGED、Event.PROPERTY_ADDED和Event.NODE_ADDED,已覆盖需求场景,但需注意:修改元数据时触发的是PROPERTY_CHANGED,创建节点时触发NODE_ADDED,若操作未触发对应事件,可通过AEM的JCR事件日志进一步排查
内容的提问来源于stack exchange,提问作者mrjayviper
相关产品推荐
相关产品推荐

