search
LoginSignup
3

posted at

updated at

【SAP BTP】CAP Service SDK for JavaでOData APIを作ってみる(1)

はじめに

CAP(SAP Cloud Application Programming Model)を利用してBTP環境にデプロイするODataAPIを作ってみます。

以前にも一度試しているものの、WebIDEベースの開発であり、最近では使えないこともあるのでBusiness Application Studioで実施しました。
今回の手順だとVSCodeなどのローカル開発環境でもほぼ同様に作れると思います。
SAP CP Trial環境でMulti Target Applicationを作ってみる【ODataService_V2の作成】

BTPでのJava開発にはSAP Cloud SDKもあり、CAPプロジェクトとの統合も可能です。
SAP Cloud SDKにはJavaアプリケーションにおけるODataクライアントはあるものの、OData APIとしてサービスを公開する機能はなさそうでした。
より多くの機能が必要となる場合は導入を検討する必要がありそうです。
SAP Cloud SDKとCAPの違い

利用しているBTP、Business Application Studio(BAS)はすべてTrial環境です

【つづき】
【SAP BTP】CAP Service SDK for JavaでOData APIを作ってみる(2)

準備

※Trial環境のサブアカウントにSpace「dev」が作成されていること前提

BASのDev Space作成

まずはTrial環境のBASへアクセスし、Dev Spaceを作成します。
作成する際に「Full Stack Cloud Application」を選択します。
image.png

HANA DBインスタンス作成

Javaアプリケーションを作り始める前に接続するHANA DB(HDIConteiner)のインスタンスを作成します。
image.png

「SAP HANA Schemas & HDI Containers Trial」をCreateします。
デフォルトのパラメータは変更せず、Instance Nameは任意です。
「demoShared」の名称で作成しました。
image.png

作成が終わったら「Instances and Subscriptions」で確認できます。
image.png

Javaアプリケーション開発

環境の準備が終わったらBASで作成したFull Stackのスペースに移動してJavaアプリケーションを作り始めます。

MTAプロジェクト作成

今回はMTAとしてJavaアプリケーションをデプロイしていくので、最初にMTAプロジェクトを作成します。
Welcomeページから「Start From Template」を選択します。
image.png
「Basic Multitarget Application」を選択し、プロジェクト名を指定してMTAを作成します。
image.png

出来上がったMTAのプロジェクトにはmta.yaml(とgitignore)のみが含まれます。
image.png

CAPプロジェクトの作成

CAPプロジェクトの作成はドキュメントのGetting Startedを参考に進めていきます。
作成したMTAプロジェクトに移動し、Mavenコマンドを実行します。

$ mvn archetype:generate -DarchetypeArtifactId="cds-services-archetype" -DarchetypeGroupId="com.sap.cds" -DarchetypeVersion="RELEASE" "-DinteractiveMode=true"

BASのターミナルでドキュメントのままコマンドをたたくとgroup ID等を聞かれないので、
"-DinteractiveMode=true"を追加します。

group ID、artifact ID等を入力する必要があるので、任意の値を指定します。
今回は以下の設定としました。

内容
groupId: jp.co.kyoso.demo
artifactId: capdemoservice
package: ※デフォルト

成功するとMTA内にプロジェクトが生成されました。
image.png

サンプル

生成したCAPプロジェクトにはアプリケーションの中身が存在しません。
まずはテスト実行、Deploy、DB接続等を理解するためにサンプルのアプリケーションを生成します。

※サンプルを利用せずODataサービス開発をする場合の方法は以下に記載しているので参照ください。
【SAP BTP】CAP Service SDK for JavaでOData APIを作ってみる(2)

CAPプロジェクトのディレクトリに移動して以下のコマンドを実行します。

$ cd capdemoservice/
$ mvn com.sap.cds:cds-maven-plugin:addSample

中身が増えました。
それぞれの内容に関しては公式ドキュメントを参照してください。
image.png

テスト実行

上記まで終えたらローカルで実行してみます。

$ mvn spring-boot:run

localhost:8080で実行された内容を確認すると、サービスが起動しています。
image.png

Booksエンティティ(/odata/v4/CatalogService/Books)へアクセスするとデータが表示されています。
image.png

ローカルのテスト実行の場合はdb/data/my.bookshop-Books.csvのデータが表示されます。
image.png

BTPへDeploy

CAPによるODataAPIの実行が確認できたので、一度BTP環境へデプロイしてみます。
MTAとしてDeployをするために mta.yaml ファイルに追加したJavaアプリケーションを記載します。

mta.yaml
_schema-version: "3.2"
ID: mtademo
version: 0.0.1

# JavaModuleを追加
modules:
  - name: capdemo_api
    type: java
    path: capdemoservice
    parameters:
      buildpack: java_buildpack
    properties:
      SPRING_PROFILES_ACTIVE: cloud
    build-parameters:
      builder: custom
      commands: [ mvn clean package ]
      build-result: "srv/target/*-exec.[wj]ar"
    provides:
      - name: srv-api # required by consumers of CAP services (e.g. approuter)
        properties:
          srv-url: ${default-url}

MTAプロジェクトのルートディレクトリでmbt buildコマンドを実行します。

$ mbt build

成功すると mta_archives/ ディレクトリが作成され、配下に.mtarファイルが生成されます。
image.png

DeployにはCF CLIを用います。
cf login でTrial環境へログインします。

$ cf login

image.png

ログイン出来たら cf deploy で先ほど作成した.mtarファイルをデプロイします。

cf deploy mta_archives/mtademo_0.0.1.mtar 

Process finished. が表示されていれば成功です。
image.png

devスペースのApplicationsでデプロイしたJavaアプリケーションを確認できます。
image.png

アプリケーションにアクセスすると動作していることが確認できます。
image.png

ただし、Booksエンティティ(/odata/v4/CatalogService/Books)にデータは表示されていません。
DBと接続していないので中身が空です。
image.png

DBとの接続

mta.yamlを編集

CAPの接続先DBはデフォルトだとService Bindingが定義されているDBとなります。
そのため mta.yaml ファイルを編集し、Javaアプリケーション(capdemo_api)と準備段階で作成したHANA DBのインスタンスにBindingを定義します
mta.yaml ファイルに以下を追記します

mta.yaml
_schema-version: "3.2"
ID: mtademo
version: 0.0.1

# JavaModule
modules:
  - name: capdemo_api
    type: java
    path: capdemoservice
    parameters:
      buildpack: java_buildpack
    properties:
      SPRING_PROFILES_ACTIVE: cloud
    build-parameters:
      builder: custom
      commands: [ mvn clean package ]
      build-result: "srv/target/*-exec.[wj]ar"
    provides:
      - name: srv-api # required by consumers of CAP services (e.g. approuter)
        properties:
          srv-url: ${default-url}
    # resources -> useDemoSharedをJavaModuleに追加
    requires:
     - name: useDemoShared
       properties:
          JBP_CONFIG_RESOURCE_CONFIGURATION: '[tomcat/webapps/ROOT/META-INF/context.xml:
             {"service_name_for_DefaultDB" : "~{hdi-container-name}"}]'
resources:
  # 作成済みのHANA DBサービスをresourcesに記載
  - name: useDemoShared
    parameters:
      service-name: demoShared
      service: hanatrial
      service-plan: securestore
      config:
        schema: sampleSchema
    properties:
      hdi-container-name: '${service-name}'
    type: org.cloudfoundry.existing-service

もう一度MTAをBuildしてデプロイを実行します。

$ mbt build
$ cf deploy mta_archives/mtademo_0.0.1.mtar

HANA DBにテーブル追加

APIを実行する前にCDSに定義されているデータ構造をHANA DBに作成します。
HANA DBへのアクセスはBASの「SAP HANA Database Explorer」を使います。
image.png
※「SAP HANA Database Explorer」へアクセスするためのパラメータはHANA DBとJavaアプリケーションのBinding情報から拾うことができます

以下のSQLでTable / Viewを作成します。
(Javaプロジェクトのresource/schema.sqlに記載されている内容)

CREATE TABLE my_bookshop_Books (
  ID INTEGER NOT NULL,
  title NVARCHAR(5000),
  stock INTEGER,
  PRIMARY KEY(ID)
);

CREATE VIEW CatalogService_Books AS SELECT
  Books_0.ID,
  Books_0.title,
  Books_0.stock
FROM my_bookshop_Books AS Books_0;

テーブルを作成して以下のデータを登録しました。
image.png

更新されたJavaのODataAPIを実行すると、無事にDBへ登録した値が取得できています。
image.png

追記(2022/07)

改めて上記の手順でCAPプロジェクトを作成したところ、HANA DBとのBindingを設定してもデプロイしたODataAPIがDBにアクセスできていない状況を確認しました。
image.png

暫定の対処としては pom.xml に記載されている cds.services.version のバージョンを下げることで
今回は1.26.0 → 1.24.0に下げることでデータが取得できること確認しました。
image.png

※※※
1.26.0以上の場合、CloudFoundryターゲットプラットフォームを追加する対応が必要なのだと思いますが、こちらを実行した場合はBooksエンティティへのアクセス時にBasic認証が求められますが通りません。。
認証をパスするもしくは回避する方法がわかり次第、追記します
※※※

おわりに

CAP Service SDK for Javaを使ってODataAPIが構築できることが確認できました。
今回はSampleプロジェクトを使うのみだったので、次は実際サービス開発を進めていきたいと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3