You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Confluence自定义宏中访问页面属性及获取页面与子页面标签?

关于Confluence自定义宏访问页面属性及获取页面标签的实现方案

当然可以实现这两个需求!下面我会结合Confluence插件开发的实际经验,给你具体的实现思路和代码示例:

一、访问页面属性

在Confluence自定义宏中,你可以通过Confluence提供的核心服务类来获取页面属性,关键用到PageManager和PagePropertiesManager这两个服务:

  1. 首先在你的宏类中通过依赖注入引入这两个服务:
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方法实现...
}
  1. 在宏的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的方法获取子页面:

  1. 先注入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;
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:59:17