这个博客上,还没有写过SAP技术栈的东西,这次开个头,写个最近研究SAP CAP的摸索过程。虽然SAP CAP(Cloud Application Model)关注在Cloud的开发,我这些文章里面还是偏重本地上的尝试。
首先,得明白什么是CAP。用我自己的话来讲,CAP是SAP推出的、适配Cloud Native的编程框架。它提供了一系列架构层面的抽象,并提供了基于Nodejs和Java两个技术栈的实现。
CAP的官方网站,点击链接访问。
其次,CAP的实现中,很大程度上集成了SAP这些年来的技术方案。譬如,CAP开发的Service或者API,可以很方便的提供oData的语义。oData是微软提出来的基于REST的语义解释框架,详情参阅oData官方网站。
再次,在本地开发CAP,需要的一些基本组件及其安装。
本文中使用如下软件或插件:
当然,在国内的网络环境,常用nodejs和maven的mirror设置都要设置好——这能极大的提升开发效率。
现在可以创建一个project了。
可以使用如下的Maven命令:
mvn org.apache.maven.plugins:maven-archetype-plugin:3.1.2:generate -DarchetypeArtifactId="cds-services-archetype" -DarchetypeGroupId="com.sap.cds" -DarchetypeVersion="1.32.0" -DgroupId="com.alvachien.learncap" -DartifactId="demo-service"
打开Visual Studio Code的 Command Palette...
,输入 ‘Java: Create Project’,在列表中选择’Maven: create from archetype’。
在弹出对话框中输入archetype: cds-service-archetype
使用CDS SDK的命令同样可以创建一个Project。
cds init demo-service --add java
注意,·cds·其实是nodejs的命令。所以,我理解里面,SAP CDS自身的Tools都是基于Nodejs的。
srv
文件夹下新建一个cds文件该cds文件定义DemoService
,并为其添加一个Entity。这里,Entity的概念来自于oData。可以自行查看oData的文档。
service DemoService {
entity DemoEntity {
key ID: Integer;
title: String(111);
descr: String(1111);
}
}
在Application.java
文件的同层,创建一个handlers
的文件夹,并创建一个DemoService.java
的文件:
package com.alvachien.learncap.demoservice.handlers;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Component;
import com.sap.cds.services.cds.CdsCreateEventContext;
import com.sap.cds.services.cds.CdsReadEventContext;
import com.sap.cds.services.cds.CdsService;
import com.sap.cds.services.handler.annotations.On;
import com.sap.cds.services.handler.annotations.ServiceName;
@Component
@ServiceName("DemoService")
public class DemoService {
private Map<Object, Map<String, Object>> dataInMemory = new HashMap<>();
@On(event = CdsService.EVENT_CREATE, entity = "DemoService.DemoEntity")
public void onCreate(CdsCreateEventContext context) {
context.getCqn().entries().forEach(e -> dataInMemory.put(e.get("ID"), e));
context.setResult(context.getCqn().entries());
}
@On(event = CdsService.EVENT_READ, entity = "DemoService.DemoEntity")
public void onRead(CdsReadEventContext context) {
context.setResult(dataInMemory.values());
}
}
运行maven命令来编译项目。
mvn clean install
命令运行成功后,项目中添加了一堆文件,主要在 srv/src/resources/edmx
下.
运行项目来启动Service。
mvn clean spring-boot:run
打开$metadata
链接可以查看详细的Odata Metadata文件。
这比之前的Olingo 项目容易太多,当然Olingo项目也是SAP开发并捐献给Apache孵化的。
这个Service已经可以正常运行。
使用Postman来测试该项目。