AEM Servlet遇RuntimeNodeTraversalException及404问题求助
AEM Servlet获取请求参数时出现404与节点遍历超限问题解决方案
问题现象
- 初始Servlet仅返回"Hello World",POSTMAN调用正常
- 新增
request.getParameter("ExpData")获取参数后,调用返回404无内容,AEM日志报错:org.apache.jackrabbit.oak.query.RuntimeNodeTraversalException: The query read or traversed more than 100000 nodes. To avoid affecting other tasks, processing was stopped
- 调整AEM配置管理器中的"In memory read limit"后问题未解决
原因分析
该错误并非getParameter方法直接触发——该方法仅处理HTTP请求参数,不会执行JCR节点查询。核心问题是Sling请求匹配逻辑异常:当请求携带参数时,Sling未正确匹配Servlet路径绑定,反而将请求误解析为JCR资源查询,触发大量节点遍历操作。
解决方案
1. 修正Servlet注解的参数拼写
原注解存在两处拼写错误,导致Sling无法正确识别匹配规则:
Path改为复数pathsmethod改为复数methods,建议用HttpConstants常量避免大小写问题
修正后的代码示例:
import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.servlets.HttpConstants; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; import org.osgi.service.component.annotations.Component; import javax.servlet.ServletException; import java.io.IOException; @Component(service = javax.servlet.Servlet.class) @SlingServlet( paths = {"/bin/Exp/test01"}, methods = {HttpConstants.METHOD_GET} ) public class TestServlet extends SlingSafeMethodsServlet { @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { String data = request.getParameter("ExpData"); response.getWriter().write(data != null ? data : "No data received"); } }
(注:补充空值判断避免空指针,添加@Component注解确保OSGi正常注册)
2. 显式指定Servlet匹配规则
通过添加extensions或resourceTypes属性,明确Servlet匹配范围,避免Sling误解析:
@SlingServlet( paths = {"/bin/Exp/test01"}, methods = {HttpConstants.METHOD_GET}, extensions = {"txt"}, // 仅匹配带.txt后缀的请求 resourceTypes = {"sling/servlet/default"} )
3. 检查请求重写与Dispatcher配置
- 登录AEM Felix Console(/system/console/configMgr),检查Apache Sling Rewriter规则,确认
/bin/路径带参数的请求未被异常重写 - 若使用Dispatcher,检查dispatcher.any配置,确保
/bin/Exp/test01带参数的请求未被转发到JCR查询路径
4. 验证Servlet注册状态
- 访问Felix Console组件页面(/system/console/components),搜索
TestServlet - 确认组件状态为Active,且"Paths"属性与代码配置一致
5. 临时更换参数名测试
将参数名ExpData改为testData等其他名称,排除参数名与Sling内部解析规则冲突的可能
内容的提问来源于stack exchange,提问作者Han Lu
相关产品推荐
相关产品推荐

