绑定到资源类型 OSGi R6 注释的 Sling servlet 不起作用
Sling servlet bound to resource Type OSGi R6 annotations does not work
我想将一个 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-us/fun-games.info.js 时,我的 servlet 应该被调用,它现在正在打印 hello world 字符串。(如果被调用)
当我使用 OSGi R6 注释时,当我使用 selector = info 和 extension = js 点击上面的 URL 时,这个 servlet 没有被选择。
但这适用于旧的 SCR 注释。我已检查我的 servlet 是否已正确注册。
不确定发生了什么。
注意:我使用的是 AEM 6.5
我提到了这个Link for OSGi R6
我的天啊,这比我想象的要难。
我使用 OSGi R7 注释解决了这个问题。我不知道它们存在,AEM 支持它。
@Component(immediate = true,service = { Servlet.class })
@SlingServletResourceTypes(
resourceTypes="project/project-foundation/components/structure/page",
methods= "GET",
selectors={ "info", "js"})
还要注意的另一件事是我使用 "js" 作为选择器而不是扩展名。
我是这样调用页面的
/en-us/fun-games/mario.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
尝试点击 servlet,同时在路径中提供 JCR 内容,例如:
en-us/fun-games/_jcr_content.info.js
我遇到了同样的问题,但是当我在路径中提供 JCR 内容时,它起作用了。
我想将一个 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-us/fun-games.info.js 时,我的 servlet 应该被调用,它现在正在打印 hello world 字符串。(如果被调用)
当我使用 OSGi R6 注释时,当我使用 selector = info 和 extension = js 点击上面的 URL 时,这个 servlet 没有被选择。
但这适用于旧的 SCR 注释。我已检查我的 servlet 是否已正确注册。
不确定发生了什么。
注意:我使用的是 AEM 6.5
我提到了这个Link for OSGi R6
我的天啊,这比我想象的要难。
我使用 OSGi R7 注释解决了这个问题。我不知道它们存在,AEM 支持它。
@Component(immediate = true,service = { Servlet.class })
@SlingServletResourceTypes(
resourceTypes="project/project-foundation/components/structure/page",
methods= "GET",
selectors={ "info", "js"})
还要注意的另一件事是我使用 "js" 作为选择器而不是扩展名。
我是这样调用页面的 /en-us/fun-games/mario.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
尝试点击 servlet,同时在路径中提供 JCR 内容,例如:
en-us/fun-games/_jcr_content.info.js
我遇到了同样的问题,但是当我在路径中提供 JCR 内容时,它起作用了。