对于 SAP Cloud SDK 版本 2:
这个版本需要一些额外的信息JwtBasedRequestContextExecutor.onBehalfOfTenant
才能工作。对于您要操作的每个租户,需要以下内容:
租户 ID。在使应用程序订阅就绪时,您必须实现一个订阅回调端点,只要租户订阅您的应用程序,SCP 就会调用该端点。SCP 调用的 URL 包含您可以提取的租户 ID。您的回调 servlet 现在应该将此租户 ID 保存在某处。
租户的 XSUAA 实例的完全限定 URI。您还可以从订阅回调端点获得其中的一部分。SCP 使用包含名为 的属性的 JSON 有效负载调用您的端点subscribedSubdomain
。您的回调 servlet 现在应该与租户 ID 一起保存在某个地方。这会处理主机名部分,但JwtBasedRequestContextExecutor
需要完整的 XSUAA URI(例如https://[subscribedSubdomain].[uaadomain]
)。一种方法是使用 获取提供者的 XSUAA 信息并提取uaadomain
参数(基本上从 加载VCAP_SERVICES
)CloudPlatformAccessor
,如下所示:
final String tenantXsuaaUri = "https://" + subscribedSubdomain + "." + ((ScpCfCloudPlatform)CloudPlatformAccessor.getCloudPlatform()).getXsuaaServiceCredentials().get("uaadomain").getAsString();
提供者的 XSUAA 实例的 XS 应用程序名称。为此,您可以使用CloudPlatformAccessor
类似的方法(同样,从 加载VCAP_SERVICES
):
final String xsAppName = ((ScpCfCloudPlatform)CloudPlatformAccessor.getCloudPlatform()).getXsAppName();
一旦你最终拥有了所有需要的参数,你可以JwtBasedRequestContextExecutor.onBehalfOfTenant
像这样调用以作为所需的租户运行一些东西:
new JwtBasedRequestContextExecutor()
.onBehalfOfTenant(tenantId, tenantXsuaaUri, Collections.singletonList(xsAppName))
.withParentRequestContext()
.execute(() -> {
// your code goes here
});
对于 SAP Cloud SDK 版本 3:
这个版本已经改进,作为另一个租户执行代码更容易,所以我建议如果可能的话升级到版本 3。使用版本 3,您只需要租户 ID 和subscribedSubdomain
值(无需形成完整的 XSUAA URI)。而不是JwtBasedRequestContextExecutor
你会使用这样的TenantAccessor
类和executeWithTenant
方法:
final Tenant subscribedTenant = new ScpCfTenant(tenantID, subscribedSubdomain);
TenantAccessor.executeWithTenant(subscribedTenant, () -> {
// your code goes here
});
SAP Cloud SDK 版本 3 概述:
https ://blogs.sap.com/2019/08/01/version-3-of-the-sap-cloud-sdk-for-java-is-here/
第 3 版迁移指南:
https ://blogs.sap.com/2019/08/01/migrate-to-version-3.0.0-of-the-sap-cloud-sdk-for-java/
第 3 版发行说明:
https ://help.sap.com/doc/6c02295dfa8f47cf9c08a19f2e172901/1.0/en-US/index.html