在优锐课的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生成器的更多相关文章

  1. Angular2开发笔记

    Problem 使用依赖注入应该注意些什么 服务一般用来做什么 指令一般用来做什么 angular2如何提取公共组件 angular2为什么不需要提公共组件 父组件与子组件之间如何通讯 什么时候应该使 ...

  2. Spring-cloud (一):Eureka注册中心搭建

    前提 系统安装jdk1.8及以上,配置好maven的ide(这里用idea进行演示,maven版本3.5,配置阿里云源) 项目搭建 新建一个maven项目,创建最简单的那种就好,项目名这里为Eurek ...

  3. 前端工程化系列[05] Yeoman脚手架使用入门

    Yeoman是一款流行的前端的脚手架工具. 脚手架工具可以用来快速的自动生成项目的必要文件和基础文件结构.Yeoman使用的内建命令为yo,同时它自己也是一个包管理工具和自动化任务工具,它基于特定的模 ...

  4. SpringCloud (一)Eureka注册中心搭建

    前提 系统安装jdk1.8及以上,配置好maven的ide(这里用idea进行演示,maven版本3.5,配置阿里云源) 项目搭建 新建一个maven项目,创建最简单的那种就好,项目名这里为Eurek ...

  5. 基于Spring Boot的可直接运行的分布式ID生成器的实现以及SnowFlake算法详解

    背景 最近对snowflake比较感兴趣,就看了一些分布式唯一ID生成器(发号器)的开源项目的源码,例如百度的uid-generator,美团的leaf.大致看了一遍后感觉uid-generator代 ...

  6. TypeScript 迭代器(iterator)和生成器(generator)

    ⒈迭代器(iterator) 1.可迭代性 当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的. 一些内置的类型如 Array,Map,Set,String,Int32Arra ...

  7. Spring(十一)-- Spring代理生成器

    Spring代理生成器 1.创建需要的dao接口 2.创建需要的daoImpl实现类 3.创建前置增强类 4.创建spring.xml文件 <!-- 这个案例 需要解决的问题: 一个代理工厂 配 ...

  8. 用 F# 手写 TypeScript 转 C# 类型绑定生成器

    前言 我们经常会遇到这样的事情:有时候我们找到了一个库,但是这个库是用 TypeScript 写的,但是我们想在 C# 调用,于是我们需要设法将原来的 TypeScript 类型声明翻译成 C# 的代 ...

  9. Spring Boot集成全局唯一ID生成器

    流水号生成器(全局唯一 ID生成器)是服务化系统的基础设施,其在保障系统的正确运行和高可用方面发挥着重要作用.而关于流水号生成算法首屈一指的当属 Snowflake雪花算法,然而 Snowflake本 ...

随机推荐

  1. SVN 创建发行版/分支版的步骤

    最近看了很多 Git 与 SVN 的比较,很多都说 SVN 做分支很慢,不知道是从何说起.有可能大家都不清楚,SVN 做分支的正确步骤,特此介绍一下. SVN 服务器后台使用 Berkeley DB ...

  2. 特殊权限SUID

    特殊权限SUID SUID : 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者: chmod u+s File chmod u-s File 如果 FileB本身原来就有执行权限,则S ...

  3. 2019/12/13学习内容摘要(Linux磁盘管理①)

    一,查看磁盘或目录容量 1.命令df  查看已挂载磁盘的总容量,使用容量,剩余容量等,可以不加任何参数,默认以KB为单位 选项[-i] 表示查看inodes的使用情况 [-h] 表示用合适的单位显示 ...

  4. 21.决策树(ID3/C4.5/CART)

    总览 算法   功能  树结构  特征选择  连续值处理 缺失值处理  剪枝  ID3  分类  多叉树  信息增益   不支持 不支持  不支持 C4.5  分类  多叉树  信息增益比   支持 ...

  5. element form 对单个字段做验证

    this.$refs[formName].validateField('phone', phoneError => { //验证手机号码是否正确 if (!phoneError) { conso ...

  6. 线段树模板加模板题POJ3468

    POJ - 3468 整理了个新的线段树的模板,暑期集训的时候学长给的模板,每个节点单单存了自己所要维护的内容,还是少了点.导致在写pushdown的时候,len我会有点难写.所以就整理个新的模板. ...

  7. MIT / BSD / Apache / LGPL / Mozilla / GPL 区别

    自由度:MIT > BSD > Apache > LGPL > Mozilla > GPL

  8. IntelliJ中Git突然不能用,报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)

    记录一个昨天碰到的问题以及解决方法,希望对碰到一样问题的你有用! 昨天升级了一下Mac OS,重启后再打开IntelliJ,突然Git就不能用了,报了下面这样的错: 开始以为是不是Git出了问题,打开 ...

  9. QT使用QPainter加水印

    QT使用QPainter加水印 加水印的代码 //为QPixmap添加水印 void MainWindow::addMask(QPixmap& pm, const QString& t ...

  10. C#控制内插字符串的格式

    C#6.0推出了内插字符串 结果展示: 内插表达式字段宽度和对齐方式: 结果展示:(+/-代表右对齐.左对齐,数字表示显示宽度)