TenantAccessor.getCurrentTenant() 抛出 TenantNotAvailableException:无法获取当前租户:无可用请求

TenantAccessor.getCurrentTenant() throws TenantNotAvailableException: Failed to get current tenant: no request available

所以我关注了https://blogs.sap.com/2017/12/20/deep-dive-6-with-sap-s4hana-cloud-sdk-extend-your-cloud-foundry-application-with-tenant-aware-persistency/

我在具有 xs2 库 OAuth 2.0 安全性的 SCP 中有一个 Spring 启动 2.0.1.RELEASE 应用程序 运行。如果我在 Postman 中创建一个访问令牌并直接调用我的@RestController(到达数据库),我会从 TenantAccessor.getCurrentTenant():

得到这个错误
com.sap.cloud.sdk.cloudplatform.tenant.exception.TenantNotAvailableException: Failed to get current tenant: no request available. This error may occur when trying to obtain the current tenant within tasks that are not triggered by a request, for example, while using a RequestContextExecutor. Note that, on SCP CF, a request is required to obtain tenant information from the JWT bearer in the "Authorization" header.

我不明白为什么我没有 "request available" 当我显然发送一个包含 Bearer 令牌的授权请求 header 直接到我的 @RestController.

我有一个想法通过用 @RequestScope 注释 TenantIdentifierResolver class(其中包含 TenantAccessor)来解决这个问题,但是这失败了,因为在初始化时找不到请求上下文应用程序 (entityManagerFactory).

此消息表示缺少 RequestContext. Such a RequestContext is initialized using either a RequestContextServletFilter or a RequestContextExecutor

您的 Spring 应用程序可能缺少 Web Servlet 过滤器。您可以尝试将以下 @ServletComponentScan 注释添加到您的应用程序吗?

@ServletComponentScan({"com.sap.cloud.sdk"})
  ...
@SpringBootApplication
public class Application extends SpringBootServletInitializer
{ 
    ...
}

在后台任务中,您可能必须使用 RequestContextExecutor。 有关详细信息,请同时查看相关问题 here