绑定到资源类型OSGi R6注解的Sling servlet无法工作。

问题描述 投票:0回答:1

我想将一个servlet注册到我的主基页资源类型中,这样当同一个页面被选择器和扩展器击中时,我的servlet应该被选择而不是正常的页面渲染。

我能够使用旧的SCR注解轻松实现这一行为。请看下面的工作代码。

@Component(metatype = false)
@Service({ javax.servlet.Servlet.class,
        org.apache.sling.api.servlets.SlingSafeMethodsServlet.class })
@Properties({
        @Property(name = "sling.servlet.resourceTypes", value = "project/project-foundation/components/structure/page"),
        @Property(name = "sling.servlet.selectors", value = {"info"}),
        @Property(name = "sling.servlet.extensions", value = "js"),
        @Property(name = "sling.servlet.methods", value = "GET"),
        @Property(name = "service.description", value = "Products Servlet") })

现在我想使用OSGi R6注解来实现这个功能,下面是我使用的注解。

@Component(service = Servlet.class, property = { 
        "sling.servlet.selectors=info",
        "sling.servlet.extensions=js",
        "sling.servlet.methods="+ HttpConstants.METHOD_GET,
        "sling.servlet.resourceTypes=project/project-foundation/components/structure/page"
})

当我点击en-usfun-games.info.js页面时,我的servlet应该会被调用,目前正在打印hello world字符串。(如果被调用)

当我使用OSGi R6注释时,当我点击上面的URL时,选择器=info和extension=js,这个servlet没有被选中。

但这在旧的SCR注解中可以工作。我已经检查了我的servlet被正确注册。

不知道是怎么回事。

注意:我使用的是AEM 6.5。

我参考了这个 OSGi R6的链接

aem apache-felix sling aem-6
1个回答
1
投票

我的天,这比我想象的要难。

我使用OSGi R7注解解决了这个问题。我不知道它们的存在,AEM也支持它。

@Component(immediate = true,service = { Servlet.class })
@SlingServletResourceTypes(
    resourceTypes="project/project-foundation/components/structure/page", 
    methods= "GET",
    selectors={ "info", "js"})

另外还有一点需要注意的是,我用 "js "作为选择符而不是扩展符。

我这样调用页面 en-usfun-gamesmario.info.js。

同样的servlet可以在完整或缩短的URL上调用,这并不重要。

而且还有一个依赖关系。

           <dependency>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.servlets.annotations</artifactId>
            <version>1.2.4</version>
          </dependency>

我提到的官方文档是: OSGi R7 Anoted Servlets

© www.soinside.com 2019 - 2024. All rights reserved.