ローカルのCAP Javaプロジェクトからリモート OData API へ接続する手順

Estimated read time 7 min read

目的

ローカルの CAP Java プロジェクトから、SAP S/4HANA の Sandbox OData API を呼び出してデータを取得する手順の一例をまとめます。最終的には、以下のURLにアクセスしてBusiness Partnersを取得することをゴールとします。

http://localhost:8080/odata/v4/BusinessPartnerService/BusinessPartner 

1. 検証時の環境

 SAP BTP トライアル環境

SAP Business Accelerator Hub の Sandbox 環境開発環境: Visual Studio Code Maven  3.9OpenJDK 21

2. プロジェクトの作成

2.1. CAP Javaプロジェクトの初期化

cds init cap-java-remote-api –add destination,xsuaa –java

初期化後、以下のようなプロジェクトフォルダーが作成されます。

2.2. プロジェクトをVisual Studio Code で開く

code cap-java-remote-api

3. ライブラリの追加

リモート OData API に接続するには、SAP Cloud SDK と リモート OData用のライブラリが必要です。

3.1. ルートディレクトリのpom.xml に SAP Cloud SDK の最新のバージョンをプロパティとして追加し、dependencyManagement に sdk-bom を追加します。

<properties>

<!– 最新のSDKのバージョンに置き換える –>
<cloud-sdk.version>5.20.0</cloud-sdk.version>
</properties>

<dependencyManagement>
<dependencies>

<dependency>
<groupId>com.sap.cloud.sdk</groupId>
<artifactId>sdk-bom</artifactId>
<version>${cloud-sdk.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

3.2. srv/pom.xmlに以下のライブラリを追加します。

<dependencies>

<dependency>
<groupId>com.sap.cds</groupId>
<artifactId>cds-feature-remote-odata</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>com.sap.cloud.sdk</groupId>
<artifactId>sdk-core</artifactId>
</dependency>
</dependencies>

4. ODataメタデータの取得とCSNの生成

OData API を使うには、ODataのエンティティやプロパティ情報を記載したメタデータファイル(EDMX)から、CAP内部の共通モデル表現として役割を果たす、CSN形式に変換した上で、CDSでのモデリングを行う必要があります。

4.1. SAP Business Accelerator HubのBusiness Partner (A2X)からEDMXをダウンロード

https://api.sap.com/api/API_BUSINESS_PARTNER/overview

4.2. ルートディレクトリの配下に.edmxファイルを格納

4.3. .edmxから.csn を生成

cds import API_BUSINESS_PARTNER.edmx

実行後、 srv/external フォルダに .edmx と .csn ファイルが生成されます。 

加えて、application.yaml に Destination Service のテンプレート設定が追加されます。

5. 接続設定

S/4HANA のような外部システムと接続する際に、他サービスからの再利用性も高く、接続先や認証情報を設定できるBTP の Destination Service を利用します。今回はSandbox 環境のため、APIKeyでの認証を行い、.envファイルにその情報を格納しますが、実運用環境では他の適切な認証方式を使用してください。

5.1. BTP Destination Service に S/4HANA Sandbox の情報を登録

Name: S4SandboxType: HTTPProxyType: InternetURL: https://sandbox.api.sap.com/s4hanacloudAuthentication: NoAuthentication
Sandbox環境のため、ここではNoAuthenticationを選択し、後続のapplication.yamlにてAPIKeyを.env経由で渡します。

5.2. .envにAPIKeyを設定

APIキーはBusiness Accelerator Hubから取得できます。

APIKey=<Business Accelerator Hubで取得したAPIキー>

5.3. application.yamlで接続先の設定

cds:
remote:
services:
API_BUSINESS_PARTNER:
destination:
# 対象のDestination Serviceで登録したDestination名を記載する
name: S4Sandbox
http:
suffix: /sap/opu/odata/sap
# Sandbox APIを使用する場合には、APIKeyをHTTPヘッダーに入れる必要がある
headers:
# 環境変数のAPIKeyを参照する
APIKey: ${APIKey}
type: odata-v2

6. サービスモデルとハンドラの実装

6.1 srv/business-partner-service.cdsにサービスモデルを実装

using {API_BUSINESS_PARTNER as bp} from ‘./external/API_BUSINESS_PARTNER’;

service BusinessPartnerService @(requires: ‘any’) {
entity BusinessPartner as projection on bp.A_BusinessPartner {
key A_BusinessPartner.BusinessPartner,
A_BusinessPartner.BusinessPartnerName,
A_BusinessPartner.BusinessPartnerFullName
};
}

先ほど作成した .csn に含まれる API_BUSINESS_PARTNER を投影し、サービスモデルのエンティティ BusinessPartner を定義します。

6.2. srv/src/main/java/customer/cap_java_remote_api/handlers/BusinessPartnerHandler.javaにハンドラを実装

package customer.cap_java_remote_api.handlers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.sap.cds.Result;
import com.sap.cds.services.cds.CdsReadEventContext;
import com.sap.cds.services.handler.EventHandler;
import com.sap.cds.services.handler.annotations.On;
import com.sap.cds.services.handler.annotations.ServiceName;

import cds.gen.api_business_partner.ApiBusinessPartner;
import cds.gen.businesspartnerservice.BusinessPartner_;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@ServiceName(“BusinessPartnerService”)
public class BusinessPartnerHandler implements EventHandler {

@Autowired
ApiBusinessPartner remoteBp;

private static final Logger logger = LoggerFactory.getLogger(BusinessPartnerHandler.class);
// このブログサービスの仕様でアットマークとそれに付随する文字列が消えてしまいます。下記のコードに置き換えてください。
(entity = BusinessPartner_.CDS_NAME)
public Result readBusinessPartner(CdsReadEventContext context) {
try {
logger.info(“Reading Business Partner data from S/4HANA with CQN: {}”, context.getCqn());
return remoteBp.run(context.getCqn());
} catch (Exception e) {
logger.error(“Error while reading Business Partner data from S/4HANA.”, e);
throw new RuntimeException(e);
}
}
}

上記でコメントした行をこちらに置き換えてください。

‘@On(entity = BusinessPartner_.CDS_NAME)’

また、CQNを使用する際は、CqnServiceを継承したインターフェイスを使用します。今回でいうと、remoteBpのインターフェイスであるApiBusinessPartnerは、CqnServiceを継承しています。

7. デプロイ準備

ローカルで開発したCAP JavaアプリケーションをSAP BTPのCloud Foundry環境へデプロイするための準備を行います。

7.1. MTAファイルの作成

cds add mta

mta.yamlが生成されますが、modulesに記載のcap-java-remote-api-srvが生成されただけではなく、プロジェクト初期化の際にaddオプションでつけた、xsuaaとdestinationがそれぞれバッキングサービスとしてresourcesに記載されていることが確認できます。

加えて、srv/pom.xmlに以下のライブラリが追加されます。

<dependencies>

<dependency>
<groupId>com.sap.cds</groupId>
<artifactId>cds-starter-cloudfoundry</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>

7.2. ビルド&ローカルリポジトリへのインストール

mvn clean install

8. BTPへデプロイ

8.1. mtarファイルの作成

mbt build –mtar archive
# CAPを扱う際には、前回のビルド成果物を削除したいケースが多いので、
# 下記のコマンドを叩くことが多いです。
# rm -rf mta_archives && mbt build –mtar archive

8.2. 対象のCloud Foundry環境を選択

BTP CockpitのサブアカウントページからAPI Endpointを取得できます。

cf api <対象のCFエンドポイント>

8.3. Cloud Foundryにログイン

cf login

8.4. Cloud Foundryにデプロイ

cf deploy mta_archives/archive.mtar
# デプロイが失敗した時には三度のリトライがデフォルトで実施されますが、
# 一度だけで済ませても問題ないケースが多いので、時間短縮のために、下記のコマンドをよく使います。
# cf deploy mta_archives/archive.mtar –retries 1

 8.5. BTP Cockpitでデプロイ結果を確認

9. ローカルからリモートAPIへアクセス

最後に、ローカル環境からリモートOData APIにアクセスします。そのためには、BTPにデプロイしたバッキングサービスをローカルにバインドする必要があります。

9.1. BTP上のxsuaaとdestinationをローカルにバインド

cds bind auth –to cap-java-remote-api-auth
cds bind destination –to cap-java-remote-api-destination

このバインドにより、ハイブリッド環境用のバッキングサービスの設定が行えます。

9.2. Hybrid Testing

cds bind –exec — mvn spring-boot:run

9.3. 対象エンドポイントにて、結果を確認

http://localhost:8080/odata/v4/BusinessPartnerService/BusinessPartner

CAP Javaプロジェクトのお役に立てれば幸いです!

 

​ 目的ローカルの CAP Java プロジェクトから、SAP S/4HANA の Sandbox OData API を呼び出してデータを取得する手順の一例をまとめます。最終的には、以下のURLにアクセスしてBusiness Partnersを取得することをゴールとします。http://localhost:8080/odata/v4/BusinessPartnerService/BusinessPartner 1. 検証時の環境 SAP BTP トライアル環境SAP Business Accelerator Hub の Sandbox 環境開発環境: Visual Studio Code Maven  3.9OpenJDK 212. プロジェクトの作成2.1. CAP Javaプロジェクトの初期化cds init cap-java-remote-api –add destination,xsuaa –java初期化後、以下のようなプロジェクトフォルダーが作成されます。2.2. プロジェクトをVisual Studio Code で開くcode cap-java-remote-api3. ライブラリの追加リモート OData API に接続するには、SAP Cloud SDK と リモート OData用のライブラリが必要です。3.1. ルートディレクトリのpom.xml に SAP Cloud SDK の最新のバージョンをプロパティとして追加し、dependencyManagement に sdk-bom を追加します。<properties>

<!– 最新のSDKのバージョンに置き換える –>
<cloud-sdk.version>5.20.0</cloud-sdk.version>
</properties>

<dependencyManagement>
<dependencies>

<dependency>
<groupId>com.sap.cloud.sdk</groupId>
<artifactId>sdk-bom</artifactId>
<version>${cloud-sdk.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>3.2. srv/pom.xmlに以下のライブラリを追加します。<dependencies>

<dependency>
<groupId>com.sap.cds</groupId>
<artifactId>cds-feature-remote-odata</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>com.sap.cloud.sdk</groupId>
<artifactId>sdk-core</artifactId>
</dependency>
</dependencies>4. ODataメタデータの取得とCSNの生成OData API を使うには、ODataのエンティティやプロパティ情報を記載したメタデータファイル(EDMX)から、CAP内部の共通モデル表現として役割を果たす、CSN形式に変換した上で、CDSでのモデリングを行う必要があります。4.1. SAP Business Accelerator HubのBusiness Partner (A2X)からEDMXをダウンロードhttps://api.sap.com/api/API_BUSINESS_PARTNER/overview4.2. ルートディレクトリの配下に.edmxファイルを格納4.3. .edmxから.csn を生成cds import API_BUSINESS_PARTNER.edmx実行後、 srv/external フォルダに .edmx と .csn ファイルが生成されます。 加えて、application.yaml に Destination Service のテンプレート設定が追加されます。5. 接続設定S/4HANA のような外部システムと接続する際に、他サービスからの再利用性も高く、接続先や認証情報を設定できるBTP の Destination Service を利用します。今回はSandbox 環境のため、APIKeyでの認証を行い、.envファイルにその情報を格納しますが、実運用環境では他の適切な認証方式を使用してください。5.1. BTP Destination Service に S/4HANA Sandbox の情報を登録Name: S4SandboxType: HTTPProxyType: InternetURL: https://sandbox.api.sap.com/s4hanacloudAuthentication: NoAuthenticationSandbox環境のため、ここではNoAuthenticationを選択し、後続のapplication.yamlにてAPIKeyを.env経由で渡します。5.2. .envにAPIKeyを設定APIキーはBusiness Accelerator Hubから取得できます。APIKey=<Business Accelerator Hubで取得したAPIキー>5.3. application.yamlで接続先の設定cds:
remote:
services:
API_BUSINESS_PARTNER:
destination:
# 対象のDestination Serviceで登録したDestination名を記載する
name: S4Sandbox
http:
suffix: /sap/opu/odata/sap
# Sandbox APIを使用する場合には、APIKeyをHTTPヘッダーに入れる必要がある
headers:
# 環境変数のAPIKeyを参照する
APIKey: ${APIKey}
type: odata-v26. サービスモデルとハンドラの実装6.1 srv/business-partner-service.cdsにサービスモデルを実装using {API_BUSINESS_PARTNER as bp} from ‘./external/API_BUSINESS_PARTNER’;

service BusinessPartnerService @(requires: ‘any’) {
entity BusinessPartner as projection on bp.A_BusinessPartner {
key A_BusinessPartner.BusinessPartner,
A_BusinessPartner.BusinessPartnerName,
A_BusinessPartner.BusinessPartnerFullName
};
}先ほど作成した .csn に含まれる API_BUSINESS_PARTNER を投影し、サービスモデルのエンティティ BusinessPartner を定義します。6.2. srv/src/main/java/customer/cap_java_remote_api/handlers/BusinessPartnerHandler.javaにハンドラを実装package customer.cap_java_remote_api.handlers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.sap.cds.Result;
import com.sap.cds.services.cds.CdsReadEventContext;
import com.sap.cds.services.handler.EventHandler;
import com.sap.cds.services.handler.annotations.On;
import com.sap.cds.services.handler.annotations.ServiceName;

import cds.gen.api_business_partner.ApiBusinessPartner;
import cds.gen.businesspartnerservice.BusinessPartner_;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
@ServiceName(“BusinessPartnerService”)
public class BusinessPartnerHandler implements EventHandler {

@Autowired
ApiBusinessPartner remoteBp;

private static final Logger logger = LoggerFactory.getLogger(BusinessPartnerHandler.class);
// このブログサービスの仕様でアットマークとそれに付随する文字列が消えてしまいます。下記のコードに置き換えてください。
(entity = BusinessPartner_.CDS_NAME)
public Result readBusinessPartner(CdsReadEventContext context) {
try {
logger.info(“Reading Business Partner data from S/4HANA with CQN: {}”, context.getCqn());
return remoteBp.run(context.getCqn());
} catch (Exception e) {
logger.error(“Error while reading Business Partner data from S/4HANA.”, e);
throw new RuntimeException(e);
}
}
}上記でコメントした行をこちらに置き換えてください。’@On(entity = BusinessPartner_.CDS_NAME)’また、CQNを使用する際は、CqnServiceを継承したインターフェイスを使用します。今回でいうと、remoteBpのインターフェイスであるApiBusinessPartnerは、CqnServiceを継承しています。7. デプロイ準備ローカルで開発したCAP JavaアプリケーションをSAP BTPのCloud Foundry環境へデプロイするための準備を行います。7.1. MTAファイルの作成cds add mtamta.yamlが生成されますが、modulesに記載のcap-java-remote-api-srvが生成されただけではなく、プロジェクト初期化の際にaddオプションでつけた、xsuaaとdestinationがそれぞれバッキングサービスとしてresourcesに記載されていることが確認できます。加えて、srv/pom.xmlに以下のライブラリが追加されます。<dependencies>

<dependency>
<groupId>com.sap.cds</groupId>
<artifactId>cds-starter-cloudfoundry</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>7.2. ビルド&ローカルリポジトリへのインストールmvn clean install8. BTPへデプロイ8.1. mtarファイルの作成mbt build –mtar archive
# CAPを扱う際には、前回のビルド成果物を削除したいケースが多いので、
# 下記のコマンドを叩くことが多いです。
# rm -rf mta_archives && mbt build –mtar archive8.2. 対象のCloud Foundry環境を選択BTP CockpitのサブアカウントページからAPI Endpointを取得できます。cf api <対象のCFエンドポイント>8.3. Cloud Foundryにログインcf login8.4. Cloud Foundryにデプロイcf deploy mta_archives/archive.mtar
# デプロイが失敗した時には三度のリトライがデフォルトで実施されますが、
# 一度だけで済ませても問題ないケースが多いので、時間短縮のために、下記のコマンドをよく使います。
# cf deploy mta_archives/archive.mtar –retries 1 8.5. BTP Cockpitでデプロイ結果を確認9. ローカルからリモートAPIへアクセス最後に、ローカル環境からリモートOData APIにアクセスします。そのためには、BTPにデプロイしたバッキングサービスをローカルにバインドする必要があります。9.1. BTP上のxsuaaとdestinationをローカルにバインドcds bind auth –to cap-java-remote-api-auth
cds bind destination –to cap-java-remote-api-destinationこのバインドにより、ハイブリッド環境用のバッキングサービスの設定が行えます。9.2. Hybrid Testingcds bind –exec — mvn spring-boot:run9.3. 対象エンドポイントにて、結果を確認http://localhost:8080/odata/v4/BusinessPartnerService/BusinessPartnerCAP Javaプロジェクトのお役に立てれば幸いです!   Read More Technology Blog Posts by SAP articles 

#SAP

#SAPTechnologyblog

You May Also Like

More From Author