1

情况是我有一个在 SCP 上运行的 multitanant 应用程序。一些客户会订阅我的应用程序。他们将为外部系统定义自己的目的地。我已经设置了can-connector。另一件事是我的应用程序没有请求上下文,它只是基于计划任务。

环境:SCP Cloudfoundry

我已经尝试成功地从提供者那里获得目的地。但在订户方面失败了。

下面的代码片段是我如何获得目的地

    log.info("==========Begin logic to get destination==========");
    Callable<Destination> callable = new Callable<Destination>() {
      @Override
      public Destination call() throws Exception {
        DestinationAccessor
            .setRetrievalStrategy("xxx", DestinationRetrievalStrategy.ALWAYS_SUBSCRIBER);
        return DestinationAccessor.getDestination("xxx");
      }
    };
    return new RequestContextExecutor().execute(callable);
4

1 回答 1

3

对于 SAP Cloud SDK 版本 2:

这个版本需要一些额外的信息JwtBasedRequestContextExecutor.onBehalfOfTenant才能工作。对于您要操作的每个租户,需要以下内容:

  1. 租户 ID。在使应用程序订阅就绪时,您必须实现一个订阅回调端点,只要租户订阅您的应用程序,SCP 就会调用该端点。SCP 调用的 URL 包含您可以提取的租户 ID。您的回调 servlet 现在应该将此租户 ID 保存在某处。

  2. 租户的 XSUAA 实例的完全限定 URI。您还可以从订阅回调端点获得其中的一部分。SCP 使用包含名为 的属性的 JSON 有效负载调用您的端点subscribedSubdomain。您的回调 servlet 现在应该与租户 ID 一起保存在某个地方。这会处理主机名部分,但JwtBasedRequestContextExecutor需要完整的 XSUAA URI(例如https://[subscribedSubdomain].[uaadomain])。一种方法是使用 获取提供者的 XSUAA 信息并提取uaadomain参数(基本上从 加载VCAP_SERVICESCloudPlatformAccessor,如下所示:

    final String tenantXsuaaUri = "https://" + subscribedSubdomain + "." + ((ScpCfCloudPlatform)CloudPlatformAccessor.getCloudPlatform()).getXsuaaServiceCredentials().get("uaadomain").getAsString();
    
  3. 提供者的 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

于 2019-08-19T15:18:19.557 回答