使用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,提问作者منى
相关产品推荐
相关产品推荐

