はじめに
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'
上記を行うことで値の登録を確認することができました。
参考文献