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

从Neo迁移到Cloud Foundry后Fiori Launchpad应用报错

迁移CF后用户角色获取失效?解决cpv2服务弃用问题

问题根源

你碰到的问题核心是:sap.ushell.cpv2是Neo环境专属的旧版站点服务API,在Cloud Foundry环境里已经被完全移除,所以调用时会返回undefined,直接导致后续获取角色的逻辑全部失效。

替代方案:用CF环境的新版SiteService

在CF里,必须改用sap.ushell.services.SiteService来获取站点角色数据,调整后的代码如下:

var that = this,
    siteService = sap.ushell.Container.getService("SiteService"),
    userId = sap.ushell.Container.getService("UserInfo")
        .getUser()
        .getId()
        .toUpperCase();

// 新版API是异步的,通过Promise获取站点模型
siteService.getSiteModel().then(function(siteModel) {
    var roles = Object.values(siteModel.getProperty("/roles"));
    // 原有的角色过滤、处理逻辑移到这里
    var delegaciones = roles
        .filter((rol) => that.isDelegacion(rol))
        .reduce(function (result, rol) {
            var delegId = rol.identification.id.split("_")[1],
                info = rol.identification.title.split("#"),
                ids = info[1] ? info[1].split("_") : [],
                userIdDefault = userId + "X";
            if(ids.find((id) => id === userId)) {
                result.push({
                    // 保留你原来的对象结构
                });
                // 其他原有逻辑
            }
            return result; // 原代码漏了返回值,补上避免报错
        }, []); // 给reduce设初始空数组,防止undefined
    
    // 这里处理delegaciones的后续逻辑,比如绑定到UI
});

几个关键调整点

  • 服务获取方式变了:不能直接调用SiteService()构造函数,要通过sap.ushell.Container.getService("SiteService")拿实例
  • 异步处理:新版getSiteModel()返回Promise,必须在回调里处理角色数据,因为站点模型是异步加载的
  • 修复原代码bug:你原来的reduce没给初始值,也没返回累加结果,很容易导致result变成undefined,这次一起补上

额外提醒

  • 确认你的UI5版本支持新版SiteService,CF环境一般配的是较新的UI5版本,如果版本太低可能需要升级
  • 迁移后要全面检查所有依赖cpv2的代码,比如站点配置、页面跳转这类逻辑,都得换成CF环境的对应API

内容的提问来源于stack exchange,提问作者Alberto Privado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:03:20