咱们能够应用了 On 正文,它替换了 CAP Java 运行时提供的事件的默认解决,以此来注册自定义事件处理程序,从而解决实体的 READ 或 CREATE 事件。
如果想减少默认解决,咱们将应用 @Before 和 @After 正文。应用 @Before 正文注册的事件处理程序旨在执行输出实体数据的验证。这使得在创立订单之前验证特定书籍的可用库存成为可能。相比之下,应用 @After 正文注册的事件处理程序能够对返回的实体进行后处理。这对于在从数据库中读取订单或其我的项目后计算总和净金额元素很有用。
假如咱们开发了一套图书管理系统,其中图书模型定义如下:
entity Products : cuid, managed {title : localized String(111);
descr : localized String(1111);
stock : Integer;
price : Decimal(9,2);
currency : Currency;
category : Association to Categories;
}
每本书有一个 stock
字段保护库存。
另一个我的项目 bookstore
,设计了 orders 和 orderItems 行我的项目模型:
咱们冀望下单时,对应图书的 stock
字段会被 OrderItems
里的 amount
字段扣减。
新建一个 handlers 文件夹,外面搁置一个文件 OrdersService.java
:
package com.sap.cap.bookstore.handlers;
import com.sap.cds.services.handler.EventHandler;
import com.sap.cds.services.handler.annotations.ServiceName;
import org.springframework.stereotype.Component;
@Component
@ServiceName("OrdersService")
public class OrdersService implements EventHandler {}
首先依据 orderItem 里蕴含的 book ID,从数据库里读取对应的图书模型,获取其库存,同订单行我的项目的 quantity 字段比拟,如果购买的数量小于库存,阐明可能下单。
创立一个新的 Configuration:
抉择 bookstore:
点击 Run module:
创立一个新的订单,guid 和 currency 都抉择的硬编码:
curl -X POST http://localhost:8080/odata/v… \
-H “Content-Type: application/json” \
-d ‘{“ID”: “50425a69-48b9-45f1-b6d2-687d55355e03”, “currency_code”: “USD”}’
创立一个新的 order item,买了两本书:amount = 2
curl -X POST http://localhost:8080/odata/v… \
-H “Content-Type: application/json” \
-d ‘{“parent_ID”: “50425a69-48b9-45f1-b6d2-687d55355e03”, “book_ID”: “abed2f7a-c50e-4bc5-89fd-9a00a54b4b16”, “amount”: 2}’
4b16 结尾的 entity 对应的 book:
初始库存为 12:
理论库存为 10:
应用如下命令能够使数据库回到初始状态:
cds deploy –to sqlite
办法 calculateNetAmount 是应用 @After 正文注册的。这意味着在从数据库中读取 OrderItems 实体之后调用该办法。正文还指定,每当读取或创立实体 OrderItems 时都应调用该办法。