掌握Spring REST TypeScript生成器
在优锐课的java分享中,讨论了关于Spring REST TypeScript生成器,该生成器创建反映后端模型和REST服务的模型和服务。码了很多干货,分享给大家参考学习。
我注意到网络开发人员创建了TypeScript模型和服务来反映我们的后端模型和REST服务。这是一项乏味的工作。更重要的是,在他们最终反映出我们后端的功能之后,这还不是终点。因为我们总是要牢记在软件开发中很常见的一件事...更改。由于一些新的业务需求,修改了后端服务。该更改迫使前端开发人员重新分析后端服务并重构前端应用程序,以便它们与服务器端匹配。
一段时间后,我开始了Web开发的冒险之旅,并提出了可以基于Java中的类型信息生成所有这些代码的想法。我开始寻找一种TypeScript生成器,该生成器将能够基于REST接口在TypeScript中创建模型和服务。正如我的研究表明的那样,已经有一些库提供了这种功能,但是它们都不能满足我们的所有需求,例如:
- 支持JavaBean约定。
- 支持FasterXML / Jackson批注。
- 对Spring框架的支持-生成TypeScript服务,可以调用在Spring中开发的REST API。
- 生成的服务符合Angular和ReactJS的特定要求(Observable或Promises API)。
因此,我们决定启动一个小型的下班时间项目,该项目将提供上述功能。它可以正常工作,我们提出了可以立即使用的解决方案。它已在我们的大多数基于Angular或React的Web应用程序的商业项目中进行了测试和使用。
正如我们的经验所表明的,我们的图书馆带来了巨大的好处。平均生成的代码占Web应用程序代码库的20%,但是就节省的更改和测试工作而言,它是无价的。由于取得了如此可喜的成果,我们公司决定将项目开源。如果你的开发设置在后端使用Spring框架,在前端使用Angular或React,那么你将获得与我们相同的收益。在这篇简短的文章中,我想介绍如何使用我们的spring-rest-2-ts TypeScript生成器进行REST。
例子
为了了解spring-rest2ts生成器的功能,让我们用Java创建一个简单的模型和REST控制器,我们将展示在TypeScript中生成的内容
public class BaseDTO {
private int id;
@JsonFormat(shape = JsonFormat.Shape.NUMBER)
private Date updateTimeStamp;
}
public class OrderDTO extends BaseDTO {
private double price;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
private LocalDateTime orderTimestamp;
}
Spring REST控制器:
@Controller
@RequestMapping("api/order")
public class OrderCtrl {
@PostMapping(consumes = {"application/json"}, produces = {"application/json"})
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public OrderDTO createOrder(@RequestBody OrderDTO entity) {
return entity;
}
@RequestMapping(path = "/{id}", method = RequestMethod.GET, produces = {"application/json"})
@ResponseBody
public OrderDTO getOrder(@PathVariable int id) {
return new OrderDTO();
}
}
在TypeScript中,对于DTO类,我们获得了两个具有映射继承的接口,其中每个字段都映射到各自的TypeScript类型:
export interface Base {
id: number;
updateTimeStamp: number;
}
export interface Order extends Base {
price: number;
/**
* pattern : dd-MM-yyyy hh:mm:ss
*/
orderTimestamp: string;
}
如我们所见,如果字段具有Jackson批注,则会将其考虑在内。 如果不是,则其转换基于Java类型到TypeScript的映射。 支持类型名称映射。 在Java中,我们通过提供适当的名称映射器来查看OrderDTO,该映射器会切断后缀DTO,然后我们获得Order类型
可观察的基础服务
模型类的映射非常容易理解。 更有趣的是Spring REST控制器的映射,在TypeScript中,该映射已生成用于调用端点的实现。 这种方法隐藏在方法名称,路径和参数下,因此代码可以抵抗后端的更改。 更重要的是,我们将返回类型转换为选定的Web框架。 对于Angular 2+,有一个生成的有效Angular服务可用于注入:
@Injectable()
export class OrderService {
httpService: HttpClient;
public constructor(httpService: HttpClient) {
this.httpService = httpService;
}
为OrderCtrl生成了OrderService。 在这里,类型名称也由类型名称映射器转换。 如果REST API与Web应用程序不在同一主机上,则可以配置baseURL,它可以是整个主机引用的路径前缀
基于承诺的服务
对于使用Promise API生成器的Web框架,正确的配置还能够生成服务类:
export class OrderService {
baseURL: URL;
public constructor(baseURL: URL = new URL(window.document.URL)) {
this.baseURL = baseURL;
}
public createOrder(entity: Order): Promise<Order> {
const url = new URL('/api/order', this.baseURL);
return fetch(url.toString(), {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(entity)
}).then(res => res.json());
}
public getOrder(id: number): Promise<Order> {
const url = new URL('/api/order/' + id + '', this.baseURL);
return fetch(url.toString(), {method: 'GET'}).then(res => res.json());
}
}
组态
由于具有更大的灵活性,因此TypeScript生成器通过代码进行配置。 无需配置文件。 这样就可以在需要的地方轻松扩展发电机。 这是最简单的生成器配置器:
Rest2tsGenerator tsGenerator = new Rest2tsGenerator();
// Java Classes filtering
tsGenerator.setModelClassesCondition(new ExtendsJavaTypeFilter(BaseDTO.class));
tsGenerator.setRestClassesCondition(new ExtendsJavaTypeFilter(BaseCtrl.class));
// Java model classes converter setup
JacksonObjectMapper jacksonObjectMapper = new JacksonObjectMapper();
jacksonObjectMapper.setFieldsVisibility(JsonAutoDetect.Visibility.ANY);
modelClassesConverter = new ModelClassesToTsInterfacesConverter(jacksonObjectMapper);
modelClassesConverter.setClassNameMapper(new SubstringClassNameMapper("DTO", ""));
tsGenerator.setModelClassesConverter(modelClassesConverter);
// Spring REST controllers converter
restClassesConverter = new SpringRestToTsConverter(new Angular4ImplementationGenerator());
restClassesConverter.setClassNameMapper(new SubstringClassNameMapper("Ctrl", "Service"));
tsGenerator.setRestClassesConverter(restClassesConverter);
// set of java root packages for class scanning
javaPackageSet = Collections.singleton("com.blueveery.springrest2ts.examples");
tsGenerator.generate(javaPackageSet, Paths.get("../target/ts-code"));
文章写道这里,感谢大家的观看。如有不足支持,欢迎补充评论。
更欢迎朋友们点赞关注,和我一起细说探讨架构那些事。
掌握Spring REST TypeScript生成器的更多相关文章
- Angular2开发笔记
Problem 使用依赖注入应该注意些什么 服务一般用来做什么 指令一般用来做什么 angular2如何提取公共组件 angular2为什么不需要提公共组件 父组件与子组件之间如何通讯 什么时候应该使 ...
- Spring-cloud (一):Eureka注册中心搭建
前提 系统安装jdk1.8及以上,配置好maven的ide(这里用idea进行演示,maven版本3.5,配置阿里云源) 项目搭建 新建一个maven项目,创建最简单的那种就好,项目名这里为Eurek ...
- 前端工程化系列[05] Yeoman脚手架使用入门
Yeoman是一款流行的前端的脚手架工具. 脚手架工具可以用来快速的自动生成项目的必要文件和基础文件结构.Yeoman使用的内建命令为yo,同时它自己也是一个包管理工具和自动化任务工具,它基于特定的模 ...
- SpringCloud (一)Eureka注册中心搭建
前提 系统安装jdk1.8及以上,配置好maven的ide(这里用idea进行演示,maven版本3.5,配置阿里云源) 项目搭建 新建一个maven项目,创建最简单的那种就好,项目名这里为Eurek ...
- 基于Spring Boot的可直接运行的分布式ID生成器的实现以及SnowFlake算法详解
背景 最近对snowflake比较感兴趣,就看了一些分布式唯一ID生成器(发号器)的开源项目的源码,例如百度的uid-generator,美团的leaf.大致看了一遍后感觉uid-generator代 ...
- TypeScript 迭代器(iterator)和生成器(generator)
⒈迭代器(iterator) 1.可迭代性 当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的. 一些内置的类型如 Array,Map,Set,String,Int32Arra ...
- Spring(十一)-- Spring代理生成器
Spring代理生成器 1.创建需要的dao接口 2.创建需要的daoImpl实现类 3.创建前置增强类 4.创建spring.xml文件 <!-- 这个案例 需要解决的问题: 一个代理工厂 配 ...
- 用 F# 手写 TypeScript 转 C# 类型绑定生成器
前言 我们经常会遇到这样的事情:有时候我们找到了一个库,但是这个库是用 TypeScript 写的,但是我们想在 C# 调用,于是我们需要设法将原来的 TypeScript 类型声明翻译成 C# 的代 ...
- Spring Boot集成全局唯一ID生成器
流水号生成器(全局唯一 ID生成器)是服务化系统的基础设施,其在保障系统的正确运行和高可用方面发挥着重要作用.而关于流水号生成算法首屈一指的当属 Snowflake雪花算法,然而 Snowflake本 ...
随机推荐
- nginx安装及配置访问本地文件
第一步安装nginx windows可以直接去官网下载,解压就能用 http://nginx.org/en/download.html ubuntu用命令行 sudo apt-get install ...
- 服务治理-Resilience4j(限流)
Bulkhead Bulkhead一般用于服务调用客户端,用于限定对特定的服务的并发请求数量,起到一下作用:1.防⽌下游依赖被并发请求冲击2.防⽌发⽣连环故障 1.配置规则“order” //允许最大 ...
- django-xadmin自定义widget插件(自定义详情页字段的显示样式)
有时候我们想要修改xadmin详情页字段的显示方式,比如django默认的ImageField在后台显示的是image的url,我们更希望看到image的缩略图:再比如django将多对多字段显示为多 ...
- PS各种行业文件创建
ps可以运用于:印刷.喷绘.网络等行业. 印刷 创建的印刷文件需要修改为毫米为单位,分辨率300以上,CMYK颜色格式: 16开的尺寸为:210*285mm:但在印刷之后,剪裁需要留出出血位,上下左右 ...
- 关于String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
关于 String path = request.getContextPath(); String basePath = request.getScheme()+"://"+req ...
- java1.8 ConcurrentHashMap 详细理解
基于 jdk1.8 Java并发包中提供的一个线程安全且高效的HashMap实现,可以完全替代HashTable,在并发编程的场景中使用频率非常之高.可能大多人只是知道它使用了多个锁代替HashTab ...
- vuex的学习
vuex是什么? vuex是专为vue.js应用程序开发的状态管理模式 它采用集中式存储管理应用所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 vuex也集成到vue的官方调式工具d ...
- 使用Redis实现延时任务(二)
前提 前一篇文章通过Redis的有序集合Sorted Set和调度框架Quartz实例一版简单的延时任务,但是有两个相对重要的问题没有解决: 分片. 监控. 这篇文章的内容就是要完善这两个方面的功能. ...
- Selenium模块的安装
Selenium模块 1.安装selenium python2:pip install selenium python3:pip install selenium 2.设置浏览器驱动 解压后必须与浏览 ...
- 【C#】学习笔记 abstract、virtual、interface使用的一些栗子
上