我们可以使用了 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/v4/OrdersService/Orders
-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/v4/OrdersService/OrderItems
-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 时都应调用该方法。

一个实际的例子学习 SAP BTP Java 应用的 @Before 注解使用方式相关推荐

  1. 一个具体的例子学习SAP S/4HANA里Fiori应用的排错分析

    在浏览器里访问如下url遇到错误: https://er9:44300/sap/opu/odata/sap/C_SALESCONTRACTITMFLFMTQ_CDS/$metadata 如何debug ...

  2. 一个具体的例子学习Java volatile关键字

    相信大多数Java程序员都学习过volatile这个关键字的用法.百度百科上对volatile的定义: volatile是一个类型修饰符(type specifier),被设计用来修饰被不同线程访问和 ...

  3. 如何在 SAP BTP Java 应用里使用 SAP HANA 数据库

    进入 SAP BTP cockpit: 把 CloudFoundry API endpoint 抄下来: https://api.cf.us10.hana.ondemand.com/ 收到如下输出: ...

  4. 通过一个实际例子学习SAP UI5的控件绘制和渲染

    以下面这个UI为例: 首先生成按钮对应的渲染器,即ButtonRenderer实例: 将渲染好的button对应的原生html代码存储到buffer里: 接下来依次是这些ui element的渲染器: ...

  5. 如何在 SAP BTP Java 应用里使用 SQLite 数据库

    SAP Cloud Application Programming 模型的推荐是将 service 和 model 模型的定义分离开. 因此,我们在 db 文件夹里定义 model model. 新建 ...

  6. 通过一个简单的例子学习Angular Injection Token工作原理

    源代码: const BASE_URL = new InjectionToken<string>('BaseUrl');const injector = Injector.create({ ...

  7. 用一个简单的例子学习Self Attention实现指代替换

    不用编程,不用数学公式,纯粹用手动方式说明Self Attention机制是如何实现指代替换的.   看下面两段话: 1. 猫过不了街道因为它太宽了. 2. 猫过不了街道因为它太胖了. 作为人类,我们 ...

  8. 一个简单的例子学习 HTML 元素property和attribute的区别

    源代码: <html> <style> </style><button disabled>Click</button> <button ...

  9. 通过一个具体的例子学习Threadlocal Test

    Created by Wang, Jerry, last modified on Jan 19, 2017

最新文章

  1. DRV8825步进电机驱动控制模块以及双轴平台
  2. 室外声音信标可行性分析
  3. 大叔手记(10):别再让面试官问你单例
  4. python print换行_聊聊 print 的前世今生
  5. linux 系统工程师 面试 开放式问答
  6. Boost:BOOST_VERIFY的用法测试程序
  7. Python+Opencv根据颜色进行目标检测
  8. 终于,把十大经典排序算法汇总了!(Java实现版)
  9. mysql 懒加载数据_jpa如何懒加载大字段,懒加载之后又如何获取懒加载字段
  10. 盘点 GitHub 上那些沙雕项目
  11. SYBASE数据导入技巧
  12. 计算机领域各个技术——汇总篇
  13. Redis 中的事件驱动模型
  14. 书店管理系统(C++初学者友好版)
  15. 超宽带 DWM1000模块 应用
  16. 如何合并两个excel表格数据
  17. 网上体育商城的设计与实现
  18. STM32的USB例程JoyStickMouse代码分析
  19. 学习C++该看什么书?
  20. Kali之——使用Easy-Creds工具攻击无线网络

热门文章

  1. 京东云金山云合并确有其事,或拉开云计算兼并序幕
  2. window10 java 设置环境变量
  3. Apache整合Tomcat
  4. 16位/32位中断机制比較
  5. 个体重构:将重构应用到生活中
  6. 【斗医】【11】Web应用开发20天
  7. linux的shell脚本语法与C语言不同之一
  8. C#中的集合、哈希表、泛型集合、字典
  9. SCA/SDO与WCF的比较
  10. 深入理解MyBatis的原理(四):映射器的用法