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

AEM切换SlingAllMethodsServlet后DefaultGetServlet被调用问题

AEM Servlet支持POST后被默认Servlet拦截的解决方案

核心原因

当Servlet同时声明支持GET和POST时,Sling的Servlet解析器可能因为优先级匹配规则或资源类型/选择器匹配精度不足,优先选择DefaultGetServlet处理请求,而非自定义Servlet。

具体排查与解决步骤

  • 精准匹配资源类型
    确保Servlet的sling.servlet.resourceTypes属性与目标页面的实际resourceType完全一致(比如页面用的是mysite/components/global-page,就不能只写mysite/components)。默认DefaultGetServlet会匹配宽泛的resourceType(如sling/servlet/default),如果自定义Servlet匹配精度不够,就会被覆盖。

  • 继承正确的Servlet基类
    要同时支持GET和POST,必须继承SlingAllMethodsServlet,而非SlingSafeMethodsServlet(后者仅支持GET、HEAD这类安全方法)。

  • 提高Servlet优先级
    通过sling.servlet.priority属性设置更高数值(比如100),默认DefaultGetServlet的优先级通常低于自定义设置的高优先级,这样解析器会优先选中你的Servlet。

  • 检查注解参数完整性
    确认sling.servlet.methods明确包含GET和POST,正确写法为{"GET", "POST"}(OSGi注解中需用大括号包裹数组),避免遗漏导致匹配失效。

  • 用Servlet解析器验证匹配列表
    在/system/console/servletresolver中输入请求路径/content/mysite/global/en/path/to/page.HelloWorld.json,查看所有匹配的Servlet:

    • 如果自定义Servlet不在列表中,说明注解配置有误(比如resourceType、selector、extension不匹配);
    • 如果在列表中但排序在DefaultGetServlet之后,说明优先级不够,需要调高数值。

正确示例代码

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.service.component.annotations.Component;

import javax.servlet.Servlet;
import java.io.IOException;

@Component(
        service = Servlet.class,
        property = {
                "sling.servlet.resourceTypes=mysite/components/global-page", // 替换为你的页面实际resourceType
                "sling.servlet.selectors=HelloWorld",
                "sling.servlet.extensions=json",
                "sling.servlet.methods={GET,POST}",
                "sling.servlet.priority=100"
        }
)
public class HelloWorldServlet extends SlingAllMethodsServlet {

    @Override
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        response.setContentType("application/json");
        response.getWriter().write("{\"msg\": \"Hello from GET\"}");
    }

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
        response.setContentType("application/json");
        response.getWriter().write("{\"msg\": \"Hello from POST\"}");
    }
}

内容的提问来源于stack exchange,提问作者jmona789

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:46:06