在 OSGI 中导入 JcrTagImpl class 时出现问题
Issue with importing JcrTagImpl class in OSGI
我需要导入 JcrTagImpl class,它位于 CQ Day 公报 5 标记 jar 文件(com.day.cq.cq-tagging)
然后我尝试将上面的 jar 添加到我的 pom.xml 的依赖项中,如下所示,然后我可以将整个包导入为 com.day.cq.tagging.*;
<dependency>
<groupId>com.day.cq</groupId>
<artifactId>cq-tagging</artifactId>
<version>5.7.18</version>
<scope>provided</scope>
</dependency>
更新:
我需要调用位于 com.day.cq.tagging.JcrTagImpl
class 中的 getTagID 方法。
AEM 使用 com.day.cq.tagging.TagCommandServlet
在标记控制台中显示 TagID。 TagCommandServlet 正在导入 JcrTagImpl class 并调用 getTagID
方法。
我有自己的 servlet,我想调用 getTagID
。我无法直接调用 JcrTagImpl 实现的 getTagID,因为它没有公开。可以通过任何注释来完成吗?你能指导我如何调用 getTagId
方法吗?
您正在尝试直接调用实现而不是服务。通常,不会公开实现,您必须改用该服务。
我想,TagManager 可以作为 Sling 服务使用,您可以使用它来处理标签。使用 @Reference 将其注入您的服务或使用 sling.adaptTo() 调整您的资源。
编辑:
就像我之前提到的,您不能直接访问实现 class,因为它不会被包导出。
不过,您可以根据需要使用以下任何一种方法来获取标签 ID。
- 如果你有标签的路径,你可以获取资源和 adaptTo Tag.class 并检索 tagID
- 可以从ResourceResolver对象中适配TagManager.class,然后解析标签的路径,得到Tag对象
- 使用JcrTagManagerFactory服务获取标签管理器,然后解析标签的路径。
@SlingServlet({ //配置})
public class MyServlet 扩展了 SlingSafeMethodsServlet {
@Reference
private JcrTagManagerFactory jcrTagManagerFactory;
protected void doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) {
//First Method
ResourceResolver resolver = req.getResourceResolver();
Resource tagResource = resolver.resolve("<<path to the tag>>");
Tag tag1 = tagResource.adaptTo(Tag.class);
tag1.getTagID();
//Second Method
TagManager tagManager = resolver.adaptTo(TagManager.class);
Tag tag2 = tagManager.resolve("<<path to tag>>");
tag2.getTagID();
//Third Approach
Session session = resolver.adaptTo(Session.class);
TagManager tagManager = jcrTagManagerFactory.getTagManager(session);
Tag tag3 = tagManager.resolve("<<path to tag>>");
tag3.getTagID();
}
}
使用TagManager,您可以获取当前资源上设置的标签或查询标签等
我需要导入 JcrTagImpl class,它位于 CQ Day 公报 5 标记 jar 文件(com.day.cq.cq-tagging)
然后我尝试将上面的 jar 添加到我的 pom.xml 的依赖项中,如下所示,然后我可以将整个包导入为 com.day.cq.tagging.*;
<dependency>
<groupId>com.day.cq</groupId>
<artifactId>cq-tagging</artifactId>
<version>5.7.18</version>
<scope>provided</scope>
</dependency>
更新:
我需要调用位于 com.day.cq.tagging.JcrTagImpl
class 中的 getTagID 方法。
AEM 使用 com.day.cq.tagging.TagCommandServlet
在标记控制台中显示 TagID。 TagCommandServlet 正在导入 JcrTagImpl class 并调用 getTagID
方法。
我有自己的 servlet,我想调用 getTagID
。我无法直接调用 JcrTagImpl 实现的 getTagID,因为它没有公开。可以通过任何注释来完成吗?你能指导我如何调用 getTagId
方法吗?
您正在尝试直接调用实现而不是服务。通常,不会公开实现,您必须改用该服务。
我想,TagManager 可以作为 Sling 服务使用,您可以使用它来处理标签。使用 @Reference 将其注入您的服务或使用 sling.adaptTo() 调整您的资源。
编辑:
就像我之前提到的,您不能直接访问实现 class,因为它不会被包导出。
不过,您可以根据需要使用以下任何一种方法来获取标签 ID。
- 如果你有标签的路径,你可以获取资源和 adaptTo Tag.class 并检索 tagID
- 可以从ResourceResolver对象中适配TagManager.class,然后解析标签的路径,得到Tag对象
- 使用JcrTagManagerFactory服务获取标签管理器,然后解析标签的路径。
@SlingServlet({ //配置}) public class MyServlet 扩展了 SlingSafeMethodsServlet {
@Reference
private JcrTagManagerFactory jcrTagManagerFactory;
protected void doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) {
//First Method
ResourceResolver resolver = req.getResourceResolver();
Resource tagResource = resolver.resolve("<<path to the tag>>");
Tag tag1 = tagResource.adaptTo(Tag.class);
tag1.getTagID();
//Second Method
TagManager tagManager = resolver.adaptTo(TagManager.class);
Tag tag2 = tagManager.resolve("<<path to tag>>");
tag2.getTagID();
//Third Approach
Session session = resolver.adaptTo(Session.class);
TagManager tagManager = jcrTagManagerFactory.getTagManager(session);
Tag tag3 = tagManager.resolve("<<path to tag>>");
tag3.getTagID();
}
}
使用TagManager,您可以获取当前资源上设置的标签或查询标签等