如何在Confluence自定义宏中访问页面属性及获取页面与子页面标签?
关于Confluence自定义宏访问页面属性及获取页面标签的实现方案
当然可以实现这两个需求!下面我会结合Confluence插件开发的实际经验,给你具体的实现思路和代码示例:
一、访问页面属性
在Confluence自定义宏中,你可以通过Confluence提供的核心服务类来获取页面属性,关键用到PageManager和PagePropertiesManager这两个服务:
- 首先在你的宏类中通过依赖注入引入这两个服务:
import com.atlassian.confluence.pages.Page; import com.atlassian.confluence.pages.PageManager; import com.atlassian.confluence.properties.PageProperties; import com.atlassian.confluence.properties.PagePropertiesManager; import com.atlassian.plugin.spring.scanner.annotation.component.Scanned; import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; import javax.inject.Inject; @Scanned public class YourCustomMacro implements Macro { private final PageManager pageManager; private final PagePropertiesManager pagePropertiesManager; @Inject public YourCustomMacro(@ComponentImport PageManager pageManager, @ComponentImport PagePropertiesManager pagePropertiesManager) { this.pageManager = pageManager; this.pagePropertiesManager = pagePropertiesManager; } // 宏的execute方法实现... }
- 在宏的
execute方法中,获取当前页面并读取其属性:
@Override public String execute(Map<String, String> parameters, String body, ConversionContext conversionContext) throws MacroExecutionException { // 获取当前页面 Page currentPage = pageManager.getPage(conversionContext.getPageContext().getPageId()); if (currentPage == null) { return "当前页面不存在"; } // 获取页面属性 PageProperties pageProperties = pagePropertiesManager.getPageProperties(currentPage); StringBuilder result = new StringBuilder("<h3>页面属性:</h3><ul>"); // 遍历所有属性键值对 for (String key : pageProperties.getKeys()) { String value = pageProperties.getProperty(key); result.append(String.format("<li>%s: %s</li>", key, value)); } result.append("</ul>"); return result.toString(); }
二、获取当前页面及子页面的标签
要实现这个需求,需要用到LabelManager来获取页面标签,同时用PageManager的方法获取子页面:
- 先注入
LabelManager服务(在上面的宏类基础上添加):
import com.atlassian.confluence.labels.Label; import com.atlassian.confluence.labels.LabelManager; // ... 其他注入保持不变 private final LabelManager labelManager; @Inject public YourCustomMacro(@ComponentImport PageManager pageManager, @ComponentImport PagePropertiesManager pagePropertiesManager, @ComponentImport LabelManager labelManager) { this.pageManager = pageManager; this.pagePropertiesManager = pagePropertiesManager; this.labelManager = labelManager; }
- 在
execute方法中获取当前页面+子页面的标签:
@Override public String execute(Map<String, String> parameters, String body, ConversionContext conversionContext) throws MacroExecutionException { Page currentPage = pageManager.getPage(conversionContext.getPageContext().getPageId()); if (currentPage == null) { return "当前页面不存在"; } StringBuilder result = new StringBuilder("<h3>页面及子页面标签:</h3>"); // 处理当前页面 appendPageLabels(currentPage, result); // 获取所有子页面(包含各级子页面,若只需直接子页面可改用getChildren方法) Iterable<Page> childPages = pageManager.getDescendants(currentPage, false); for (Page childPage : childPages) { appendPageLabels(childPage, result); } return result.toString(); } // 封装获取单个页面标签的方法 private void appendPageLabels(Page page, StringBuilder result) { result.append(String.format("<h4>页面:%s</h4><ul>", page.getTitle())); // 获取页面的所有标签 Iterable<Label> labels = labelManager.getLabels(page); for (Label label : labels) { // 获取标签名称 result.append(String.format("<li>%s</li>", label.getName())); } result.append("</ul>"); }
注意事项
- 确保你的插件依赖中包含了Confluence的核心API依赖,在
pom.xml中要正确引入相关groupId为com.atlassian.confluence的依赖 - 开发测试时记得用Atlassian SDK的
atlas-run命令启动本地Confluence实例进行验证 - 权限方面,宏的执行用户需要有对应页面的查看权限,否则可能无法获取到页面或标签信息
内容的提问来源于stack exchange,提问作者Chani
相关产品推荐
相关产品推荐

