在优锐课的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. MongoDB用户验证和权限管理

    官方参考页面: https://docs.mongodb.com/v3.6/tutorial/enable-authentication/ https://docs.mongodb.com/v3.6/ ...

  2. PWA 学习笔记(三)

    基础技术简介 Promise: 1.ES6 引入的一种异步编程的解决方案,通过 Promise 对象来提供统一的异步状态管理方法 2.一般在使用 Promise 对象的时候,首先需要对其进行实例化 3 ...

  3. SQL Server之批量清理数据库的死锁

    DECLARE killspid CURSOR  FOR (SELECT  CONVERT(VARCHAR(100), request_session_id)  FROM  sys.dm_tran_l ...

  4. V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245.1)

    V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245. ...

  5. Electron桌面项目-解决throw new Error('Electron failed to install correctly, please delete node_modules..

    前言 Electron 是一个用 HTML,CSS 和 JavaScript 来构建跨平台桌面应用程序的一个开源库.由GitHub开发的. 其原理是 Electron 通过将 Chromium 和 N ...

  6. Linux使用之centos下安装Java环境并运行Java程序

    前言 在Java中所有的程序都是在JVM上运行的.Java虚拟机(JVM)读取并处理经过编译的与平台无关的*.class文件.因为Java语言源程序编写后,先使用Java伪编译器进行伪编译,将其转换为 ...

  7. 【位图算法】什么是BitMap

    目录 1. 位图算法的简单原理 2. BitMap的开源实现 3. 使用案列 BitMap算法的核心思想是用bit数组来记录0-1两种状态,然后再将具体数据映射到这个比特数组的具体位置,这个比特位设置 ...

  8. 工作笔记 之 Python应用技术

    python socket编程详细介绍 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,建立网络通信连接至少要一对端口号(socket). Socket本质是 ...

  9. Quartz.NET总结(三)如配置jobs

    前两篇文章,已经介绍了Quartz.NET的使用和Cron表达式表达式的写法,今天说一说Quartz的配置,Quartz相关的配置有三个quartz.config.quartz_jobs.xml.lo ...

  10. css 揭秘-读书笔记

    css 揭秘 [希]Lea verou 著 css 魔法 译 该书涵盖7大主题,47个css技巧,是css进阶必备书籍,开阔思路,探寻更优雅的解决方案.这本书完全用css渲染出的html写成的(布局. ...