AEM切换SlingAllMethodsServlet后DefaultGetServlet被调用问题
核心原因
当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

