TypeScript 生成器
@BrowserCallable 或 @Endpoint 注解标记。TypeScript 生成器生成与使用 @BrowserCallable 或 @Endpoint 注解标记的 Java 服务对应的TypeScript文件。这些文件保留了 Java类的属性和类型,以便在前端提供类型安全性。
这些被注解的服务通常称为*端点(endpoints)*,尽管在 Hilla 中实际上只有一个 REST 端点,这个端点调用了浏 览器可访问的服务。在这种情况下,“端点”一词指的是那些使用注解标记的 Java 服务。
功能
生成器[since:dev.hilla:hilla@v1.2]支持多模块项目。您可以在应用程序中使用标准的 Maven 模块,甚至外部依赖项,因为端点和实体类不需要与 Hilla 应用程序处于同一个项目中。
生成器设计灵活。生成器的所有部分均为可插拔的,这意味着您可以修改默认行为或增添新的功能。
|
Note
|
Spring Boot 启用了一个 Java 编译器选项,以在类文件中保留参数名称。如果生成的类缺少参数名,您可能需要在项目中启用该选项。使用 javac -parameters 选项以支持多模块项目和所有 JVM 语言。详情请参阅 配置。
|
生成器架构
生成器包含三个部分:
- Java 字节码解析器
-
解析器读取 Java 字节码并生成 OpenAPI schema。
- TypeScript 抽象语法树(AST)生成器
-
AST 生成器读取 OpenAPI schema 并生成 TypeScript 端点,这些端点可用于后续的前端开发。
- 运行时控制器
-
运行时控制器提供服务端与客户端之间的运行时通信。
Hilla 使 用 OpenAPI 规范作为端点与 TypeScript 客户端之间的中间层。实现基于 OpenAPI 规范 3.0。详情请参阅本页末尾附录部分。
示例
生成的 TypeScript 端点
UserEndpoint.ts 类由 UserEndpoint.java 类生成。
Source code
UserEndpoint.ts
UserEndpoint.ts/**
* User endpoint.
*
* This module has been generated from UserEndpoint.java
* @module UserEndpoint
*/
import client from './connect-client.default'; 1
/**
* Check if a user is admin or not.
*
* @param id User id to be checked
* Return Return true if the given user is an admin, otherwise false.
*/
export async function isAdmin( 2
id?: number
) {
return await client.call('UserEndpoint', 'isAdmin', {id});
}UserEndpoint.java
UserEndpoint.java-
此行是任何生成的 TypeScript 类的固定部分。
connect-client.default.ts为另一个生成的文件,其中包含了ConnectClient的默认配置,并导出了名为client的实例。 -
TypeScript 生成类中的每个方法都对应于以
@Endpoint注解标记的类中的一个 Java 方法。
附录:如何将 OpenAPI 规范转换为 TypeScript 类
模块/类
生成器收集 OpenAPI 文档中所有操作(operations)的所有 tags 字段。每个标签都会生成相应的 TypeScript 文件。标签名既用作 TypeScript 模块/类名,也用作文件名。
方法
|
Note
|
生成器只支持 POST 操作。如果路径项包含除了 POST 之外的操作,生成器将停止处理。
|
路径*必须* 以 / 开头,如 Patterned Fields 所述。它被解析为 /<端点名>/<方 法名> 格式,用于调用后端的 Java 端点服务。路径中的方法名也会被重复使用为生成的 TypeScript 文件中的方法名。
方法参数
方法参数来自于 请求体对象 的 application/json 内容。
若要得到与 UserEndpoint.ts 相应的结果,请求体内容应为:
Source code
请求体
{
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "number"
}
}
}
}
}
}|
Note
|
所有请求体对象中其它类型的内容都会被 Hilla 生成器忽略。这意味着如果方法没有 |
方法返回类型
方法返回类型来自于类型为 200 的 响应对象。与请求体对象一样,生成器仅关注 application/json 内容类型。
以下是 响应对象 的一个示例:
Source code
响应对象
{
"200": {
"description": "Return true if the given user is an admin, otherwise false.",
"content": {
"application/json": {
"schema": {
"type": "boolean"
}
}
}
}
}|
Note
|
当前,生成器仅识别 |
Source code
Post 操作
{
"tags": ["UserEndpoint"], 1
"requestBody": { ...省略相同部分内容以减少篇幅... },
"responses": { ...省略相同部分内容以减少篇幅... }
}-
如 operation 对象 中所述,在 Hilla 生成器中,
tags用于将操作分类到 TypeScript 文件中。这意味着每个标签有对应的生成的 TypeScript 文件。含多个标签的操作将出现在所有生成文件中。空标签的操作将放置在Default.ts文件中。
|
Note
| 尽管多个标签不会破坏生成器,但如果在不同的 TypeScript 文件中存在两个相同方法,可能导致开发时困惑。建议每个操作仅使用一个标签。 |