在优锐课的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. 520表白酷炫html

    html表白神器,动态浮动爱心,话不多说,直接看截图吧! 下面附上完整代码.别忘了点个赞哦! <!doctype html> <html> <head> <m ...

  2. linux之任务调度,磁盘分区,yum下载

    一.crond任务调度 调度机制: 基本语法 crontab [选项] -e : bianji crontab定时任务 -l : 查询crontab -r : 删除当前用户所有的crontab任务 例 ...

  3. 剑指Offer-37.二叉树的深度(C++/Java)

    题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 分析: 递归求解左右子树的最大值即可,每遍历到一个结点,深度加1,最后 ...

  4. [算法模板]FFT-快速傅里叶变换

    [算法模板]FFT-快速傅里叶变换 感谢ZYW聚聚为我们讲解FFT~ 思路 我懒,思路和证明部分直接贴链接: rvalue LSJ-FFT与NTT基础 代码 主要思想是利用了单位根特殊的性质(n次单位 ...

  5. 3万字长文概述:通俗易懂告诉你什么是.NET?什么是.NET Framework?什么是.NET Core?

    [转载]通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core? 什么是.NET?什么是.NET Framework?本文将从上往下,循序渐进的介绍一系列相关.NET的 ...

  6. jmeter 中使用正则表达式提取依赖参数

    1:登录接口 这里有一个实际的登录接口,在响应中返回了一串token,如下图 那么我们在接下来的接口-经验库列表中,就必须带入这一串token,否则响应报错,如下图所示    如何获取登录的口令呢?这 ...

  7. 从七个方面,面试BAT大厂高级工程师,纯干货!

    转载注明:https://blog.csdn.net/WantFlyDaCheng/article/details/100078782 一.框架是重点,但别让人感觉你只会山寨别人的代码 二.别单纯看单 ...

  8. HTML中的三元表达式,灵活的使用or逻辑判断

    08.27自我总结 HTML中的三元表达式 判断内容 ? 满足返回的值 : 不满足返回的值 灵活使用or逻辑判断 比如我们某个变量为空的时候返回他另外个值 var a = msg || '没有消息'

  9. javaWeb核心技术第十三篇之Ajax

    Js--ajax--原理解释 概述:异步刷新网页,不会刷新整个页面. Get原理: <%@ page language="java" contentType="te ...

  10. springcloud Springboot vue.js Activiti6 前后分离 跨域 工作流 集成代码生成器 shiro权限

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...