我有一个Java服务器应用程序,它使用Jackson一般使用反射API序列化DTO。例如,对于此DTO界面:
->addAttributeToSelect('productcategory')
从这个界面的POJO实现中,Jackson将统一序列化以下实体:
package com.acme.library;
public interface Book {
com.acme.library.Author getAuthor();
String getTitle();
}
将使用我的TypeScript应用程序(基于AngularJS)的HTTP GET接收此有效负载:
{
"author": { "name": "F. Scott Fitzgerald"},
"title": "The Great Gatsby"
}
为了能够使用TypeScript的强类型特性,我发现自己手工编写了以下的typescript接口:
$http.get("http://localhost/books/0743273567")
.success((book: Book) => { ... });
因此,我必须保留这个相同界面的两个副本 - 这最多是麻烦的。这特别令人讨厌,因为我想在两个接口上都有相同的javadoc / jsdoc注释,这涉及到一大堆复制和粘贴。
我想找到一种自动化此过程的机制。
Java是我的主要开发语言。因此,我想找到一些能够从Java接口声明(通过反射API?)转换到相关TypeScript接口的工具。
我在此域中发现的唯一工具是NPM包module com.acme.library {
export interface Book {
author: com.acme.library.Author;
title: String;
}
}
。但是,这对我的用例来说太重了。它将Object层次结构中的方法添加到每个接口,例如ts-java
,hashCode()
,wait()
等
答案 0 :(得分:13)
您可以使用typescript-generator作为larslonne。它从Java JSON类生成TypeScript接口。您可能会发现一些有用的功能:
以下是如何在Maven中使用它的示例:
<plugin>
<groupId>cz.habarta.typescript-generator</groupId>
<artifactId>typescript-generator-maven-plugin</artifactId>
<version>1.25.322</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
<phase>process-classes</phase>
<configuration>
<jsonLibrary>jackson2</jsonLibrary>
<classes>
<class>com.acme.library.Book</class>
</classes>
<outputFile>target/rest.d.ts</outputFile>
<outputKind>module</outputKind>
</configuration>
</execution>
</executions>
</plugin>
修改:使用mvn process-classes
或稍后的阶段mvn install
运行它
您还可以向上提取<configuration>
元素两个级别并运行mvn typescript-generator:generate
。
编辑:我是typescript-generator的作者。
答案 1 :(得分:3)
我很幸运Amdatu TypeScript Generator
它可以在Gradle中运行,也可以从终端独立运行(我使用了终端,这就是这些说明的内容)
只需克隆回购,运行./gradlew
即可构建它。
为了执行它,我不得不偏离他们的指示,因为jar中没有入口点(如果使用gradle构建,则不会出现此问题,因为它会指定入口类)。 / p>
我用过:
java -cp build/libs/org.amdatu.typescriptgenerator-1.0-SNAPSHOT.jar org.amdatu.typescriptgenerator.standalone.TypeScriptGeneratorStarter
然后它应该抱怨没有typescript.settings.json
文件,它在您运行命令的目录中期望它。
我将包含我自己的示例,因为链接的repo的示例设置文件有点不清楚:
{
"folder" : "/projectsfolder/project",
"classFolder" : "target/classes",
"output" : "typscriptOutputDirectory",
"baseFolder" : "",
"clearOutput" : false,
"packages" : [
".*regexforwhatpackagesinsidetargetprojectshouldbeturnedintotypescript.*"
],
"excludePackages" : [ ],
"excludePattern" : [ ],
"types" : { },
"mapping" : { },
"enumType" : "class",
"classType" : "interface",
"classPath" : [ ]
}
设置中最重要的字段是:
folder
是已构建项目classFolder
是此生成器将在该文件夹中查找已编译的java类output
是要放置打字稿定义文件的目录,相对于执行生成器的位置packages
是一个java正则表达式,用于将哪些包转换为TypeScript定义答案 2 :(得分:2)
我目前正在开发一个与您的设置相同的项目:Java API和Typescript Web应用程序。
我们在构建API时使用cz.habarta.typescript-generator.typescript-generator-maven-plugin
生成.d.ts
文件。然后使用<type>d.ts</type>
将定义文件打包为org.codehaus.mojo.build-helper-maven-plugin
的工件。最后,工件将作为Web应用程序中的依赖项导入,其中定义文件将解压缩到target
目录中。
此设置要求您将maven用于Web应用程序,这并不理想,但为自动生成的定义文件付出的代价很小。
答案 3 :(得分:1)
我创建了一个新项目,目的是使转译过程尽可能简单:JavaModel-Converter
它可以与ide一起使用,或者仅通过命令行执行存在于dist文件夹中的jar。
您需要做的就是将Java模型放入所需的文件夹中,然后开始进行翻译过程。
我还添加了Angular样式支持。
如果您有任何要求,请公开!
从理论上讲,我的项目是一个通用的Java模型转换器,但实际上,仅支持Typescript转译
答案 4 :(得分:0)
您可以使用Script4J(这是一组库)来使用Java API在TypeScript中进行编码。尽管这是一个新项目,但可能会很有用。