0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SAP CAP】actionで渡した値から複数エンティティの操作

Posted at

はじめに

Cloud Application Programming Model(以下 CAP)
を使用した複数エンティティの更新について調査していたところactionに渡したはずの引数が受け取れなかったので原因を調査しました。

実装

以下、環境情報です。
・CAP:Java
・Javaバージョン:17
・cdsバージョン:7.5.1
・ODataバージョン:v2

二つのテーブルを定義し簡易的な更新テストを行いました

logictest.cds
namespace T;

// 1つ目のテーブルを定義する
entity Primary {
  key ID : Integer;
  name : String;
}

// 2つ目のテーブルを定義する
entity Secondary {
  key ID : Integer;
  name : String;
}

actionでイベントを定義します

logictest-service.cds
using { T as db } from '../db/logictest';

service LogictestService {
    action logicTestAddData(id:Integer,name:String) returns String;
    entity Primary as projection on db.Primary;       
    entity Secondary as projection on db.Secondary;
}

上記actionで定義されたLogicTestAddDataContextが生成されていますので値を受け取り登録を行う簡易的なコードを記載

LogictestService.java

@Component
@ServiceName("LogictestService")
public class LogictestService implements EventHandler {
    @Autowired
    CqnService LogictestService;

    // actionで定義したイベント
    @On(event = LogicTestAddDataContext.CDS_NAME)
    public void logicTestAddData(LogicTestAddDataContext context) {

        // パラメーターの値を取得
        Integer id = context.getId();
        String name = context.getName();

        // Return値
        String returnValue = "";

        // Secondaryにデータを挿入
        Map<String, Object> secondaryData = new HashMap<>();
        secondaryData.put("ID", id);
        secondaryData.put("name", name);
        CqnInsert insertSecondary = Insert.into("LogictestService.Secondary").entry(secondaryData);
        LogictestService.run(insertSecondary);
     
        // Primaryにデータを挿入
        Map<String, Object> primaryData = new HashMap<>();
        primaryData.put("ID", id);
        primaryData.put("name", name);
        CqnInsert insertPrimary = Insert.into("LogictestService.Primary").entry(primaryData);
        LogictestService.run(insertPrimary);
        
        returnValue = "データを登録しました。";

    }
}


actionについて

ここで時間を使ってしまったのですが、、
ODate v2とOdata v4ではPOSTを行った際のactionへの値の引き渡し方法が違うようで
OData v4では、リクエストボディから渡すのですが
OData v2では、アクションパラメータはリクエストボディではなくリクエストパラメータとして渡されるようです。

POST http://localhost:8080/odata/v2/LogictestService /LogicTestAddData?id=1&name='Test'

上記を行うことで値の登録を確認することができました。

参考文献

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?