从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
相关产品推荐
相关产品推荐

