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

使用ScriptRunner获取Confluence IWIKI空间页面时遇类型不匹配错误

解决Confluence脚本控制台中Space类型不匹配问题

问题核心

你推测的完全正确:spaceService.find().withKeys(spaceKey).fetch() 返回的是com.atlassian.confluence.api.model.content.Space(REST API层的模型类),而 pageManager.getPages() 要求的参数是com.atlassian.confluence.spaces.Space(Confluence核心业务层的实体类),两者分属不同类型体系,导致类型不匹配报错。

解决方案

方法1:直接用已注入的SpaceManager获取正确类型的Space

你已经通过ComponentLocator获取了SpaceManager实例,完全可以直接用它获取符合要求的com.atlassian.confluence.spaces.Space对象,无需借助SpaceService,代码更简洁且避免类型转换:

修改后的完整代码:

import com.atlassian.confluence.pages.Page
import com.atlassian.confluence.pages.PageManager
import com.atlassian.confluence.spaces.Space
import com.atlassian.confluence.spaces.SpaceManager
import com.atlassian.sal.api.component.ComponentLocator

def spaceManager = ComponentLocator.getComponent(SpaceManager)
def pageManager = ComponentLocator.getComponent(PageManager)

String spaceKey = "IWIKI"
// 直接获取业务层Space对象
Space space = spaceManager.getSpace(spaceKey)

if (space) {
    List<Page> pages = pageManager.getPages(space, true)
    // 可添加页面处理逻辑,比如打印页面信息
    pages.each { page ->
        println "页面标题: ${page.title}, 页面ID: ${page.id}"
    }
} else {
    println "未找到key为${spaceKey}的空间"
}

方法2:将API层Space转换为业务层Space(若必须使用SpaceService)

如果因场景需要保留SpaceService的使用,可通过SpaceManager将API返回的Space转换为业务层实体类:

import com.atlassian.confluence.pages.Page
import com.atlassian.confluence.pages.PageManager
import com.atlassian.confluence.spaces.Space
import com.atlassian.confluence.spaces.SpaceManager
import com.atlassian.sal.api.component.ComponentLocator
import com.atlassian.confluence.api.service.content.SpaceService
import com.atlassian.confluence.api.model.content.Space as ApiSpace
import com.onresolve.scriptrunner.runner.ScriptRunnerImpl

def spaceManager = ComponentLocator.getComponent(SpaceManager)
def pageManager = ComponentLocator.getComponent(PageManager)

String spaceKey = "IWIKI"
SpaceService spaceService = ScriptRunnerImpl.getPluginComponent(SpaceService)

// 获取API层Space对象,用别名区分类型
ApiSpace apiSpace = spaceService.find().withKeys(spaceKey).fetch()

if (apiSpace) {
    // 转换为业务层Space对象
    Space space = spaceManager.getSpace(apiSpace.key)
    List<Page> pages = pageManager.getPages(space, true)
    // 处理页面逻辑
    pages.each { page ->
        println "页面标题: ${page.title}, 页面ID: ${page.id}"
    }
} else {
    println "未找到key为${spaceKey}的空间"
}

补充提示

  • 清理代码中重复的类导入(比如多次导入Space和SpaceService),避免类型混淆。
  • 添加空值判断可防止因空间不存在导致的空指针异常。

内容的提问来源于stack exchange,提问作者منى

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:57:41