CQ5 Sling 默认 servlet,扩展名相同但接受方法不同

CQ5 Sling default servlets, same extension but different accepts methods

所以我有 2 个这样注释的 servlet:

@Component
@Service(value = {Servlet.class, NonExistingResourceServlet.class})
@Properties({
    @Property(name = "sling.servlet.resourceTypes",
            value = {"sling/servlet/default"},
            propertyPrivate = true),
    @Property(name = "sling.servlet.extensions",
            value = {"xml"},
            propertyPrivate = true),
    @Property(name = "sling.servlet.methods",
            value = {"GET"},
            propertyPrivate = true))

对于两者,我都覆盖了接受方法

@Override
public boolean accepts(SlingHttpServletRequest request) {
    String requestURI = request.getRequestURI();
    if (StringUtils.isNotBlank(requestURI)){
        return requestURI.endsWith("/sevlet1.xml"); //different for the other servlet
    } else {
        return false;
    }
}

IN CQ /system/console/servletresolver 其中一个未解决。我必须在配置上更具体吗?接受方法还不够吗? 发现于 Apache Sling doc

If a registered servlet implements the OptingServlet interface, Sling uses that servlet's accepts(SlingHttpServletRequest request) method to refine the servlet resolution process. In this case, the servlet is only selected for processing the current request if its accept method returns true.

对于其中一个,我添加了一个选择器,现在有所不同了。 我的问题是,如果我覆盖了 accepts 方法,为什么还需要添加选择器?

2个servlet是这样的: /content/myapp/sevlet1.xml /content/myapp/sevlet2.xml

我不确定 /system/console/servletresolver 工具是否考虑了 OptingServlet,您也可以在您的 accept 方法中放置一个调试器断点,以检查它们是否在相应的 HTTP 请求时实际被调用进来。另请注意,您的 servlet 需要声明为“implements OptingServlet”,我想情况就是这样,因为您的 accepts 方法上有一个 @Override 注释。

请注意,在 Sling 中通常不推荐检查请求 URI 的OptingServlet,推荐的最佳做法是基于资源类型或选择器进行调度。

(编辑:)您还可以将您的代码与 Sling 集成测试中的 example OptingServlet 进行比较。