使用 S/4HANA Cloud SDK >= 2.0.0 执行 OData 查询时出现 DestinationAccessException

DestinationAccessException while executing OData Query with S/4HANA Cloud SDK >= 2.0.0

我正尝试使用 https://blogs.sap.com/2017/05/21/step-4-with-sap-s4hana-cloud-sdk-calling-an-odata-service/ 中所述的 VDM 从 S/4HANA Cloud 1805 系统中读取 OData 服务数据。目的地使用基本身份验证。

调用示例:

final ErpConfigContext context = new ErpConfigContext("...");
return new DefaultQualityInspectionDataService().getAllInspectionLot().select(...).execute(context);

这至少在 S/4HANA Cloud SDK 版本 1.9.4 之前有效。由于更新到 2.0.0,由于以下异常,目的地无法再使用:

2018 06 18 12:43:55#+00#ERROR#org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/app-application].[com.sap.cloud...Servlet]##anonymous#https-jsse-nio-8041-exec-3#na#a078260ed#app#web#a078260ed#na#na#na#na#Allocate exception for servlet [com.sap.cloud...Servlet] com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException: Failed to get ConnectivityConfiguration: no RequestContext available. Have you correctly configured a RequestContextFactory or have you wrapped your logic in a RequestContextExecutor when executing background tasks that are not triggered by a request?
at com.sap.cloud.sdk.cloudplatform.connectivity.ScpNeoDestinationFacade.getConnectivityConfiguration(ScpNeoDestinationFacade.java:60)
at com.sap.cloud.sdk.cloudplatform.connectivity.ScpNeoDestinationFacade.getDestinationConfiguration(ScpNeoDestinationFacade.java:108)
at com.sap.cloud.sdk.cloudplatform.connectivity.ScpNeoDestinationFacade.getGenericDestination(ScpNeoDestinationFacade.java:183)
at com.sap.cloud.sdk.cloudplatform.connectivity.DestinationAccessor.getGenericDestination(DestinationAccessor.java:136)
at com.sap.cloud.sdk.s4hana.connectivity.ErpConfigContext.<init>(ErpConfigContext.java:218)
at com.sap.cloud.sdk.s4hana.connectivity.ErpConfigContext.<init>(ErpConfigContext.java:367)
at com.sap.cloud.sdk.s4hana.connectivity.ErpConfigContext.<init>(ErpConfigContext.java:442)
at com.sap.cloud...Servlet.<init>(...Servlet.java:31)
...
at java.lang.Thread.run(Thread.java:808)

调用 HTTP servlet 时会立即发生异常,即使尚未使用 Destination 也是如此。 ErpConfigContext 似乎有问题。从 2.0.0 开始,Destination 必须配置 ErpConfigContext 而不是 ErpEndpoint。我已阅读有关 ErpConfigContext 和 RequestContext 处理的迁移指南 (https://blogs.sap.com/2018/06/05/migration-guide-moving-to-version-2.0.0-of-the-sap-s4hana-cloud-sdk/),但该解决方案不适用于我的应用程序,因为我从未使用过 RequestContextListener,但它仍然有效。

此外,在使用 1.9.4 时,使用 ErpConfigContext 时使用相同的编码,所以问题似乎是对 2.x.x 的更新。更新到2.1.0也没有解决问题

我 运行 遇到过几个 OData 服务的这个问题。

除了等待新的 SDK 更新之外,是否有解决此问题的方法?

您是否可以在 servlet 的构造函数中初始化 ErpConfigContext? 您可以尝试在 servlet 的 doGet() 方法中调用 new ErpConfigContext("...") 吗?这里的问题可能是 RequestContext 的初始化只发生在 servlet 的过滤器链中。