Создать Typescript Интерфейсы от интерфейсов Java
У меня есть серверное приложение Java, которое использует Jackson для генерации сериализации DTO с помощью API отражения. Например, для этого интерфейса DTO:
package com.acme.library;
public interface Book {
com.acme.library.Author getAuthor();
String getTitle();
}
Из реализации POJO этого интерфейса Джексон будет генерировать сериализацию следующего объекта:
{
"author": { "name": "F. Scott Fitzgerald"},
"title": "The Great Gatsby"
}
Эта полезная нагрузка будет получена с помощью HTTP GET из моего приложения TypeScript, которое основано на AngularJS:
$http.get("http://localhost/books/0743273567")
.success((book: Book) => { ... });
Чтобы я мог использовать строго типизированный характер TypeScript, я обнаружил, что кодирую следующий интерфейс TypeScript:
module com.acme.library {
export interface Book {
author: com.acme.library.Author;
title: String;
}
}
В результате я должен поддерживать две копии этого же интерфейса, что в лучшем случае является громоздким. Это особенно неприятно, так как я хотел бы иметь те же комментарии javadoc/jsdoc на обоих интерфейсах, что подразумевает целую кучу copy & paste.
Я хотел бы найти механизм для автоматизации этого процесса.
Java - это мой основной язык разработки. Таким образом, я хотел бы найти инструмент, способный конвертироваться из декларации интерфейса Java (через API отображения) в соответствующий интерфейс TypeScript.
Единственным инструментом, который я обнаружил в этом домене, является пакет NPM ts-java
. Однако, это слишком тяжело для моего случая использования. Он добавляет методы из иерархии объектов в каждый интерфейс, например. hashCode()
, wait()
, getClass()
и т.д.
Ответы
Ответ 1
Вы можете использовать генератор текстов, как уже упоминалось. Он генерирует интерфейсы TypeScript из классов Java JSON. Некоторые функции, которые вы можете найти полезными:
- Плагин Maven и Gradle (также может быть вызван непосредственно из Java)
- Джексон 1 и Джексон 2
- коллекции, перечисления, наследование, дженерики
- Комментарии Javadoc к комментариям JSDoc
- подробная документация (README, Wiki, плагин Maven)
- релизы в Maven центральном репо
Вот пример того, как использовать его от 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
.
Изменение: я автор машинописного генератора.
Ответ 2
Мне повезло с Amdatu TypeScript Generator
Он может работать в Gradle или автономно от терминала (я использовал терминал, так что эти инструкции здесь)
Просто выполните клонирование репо, запустите ./gradlew
, чтобы создать его.
Чтобы выполнить его, мне пришлось немного отклониться от их инструкций, потому что в банке не было точки входа (у вас не было бы этой проблемы, если вы используете конструкцию Gradle, потому что она будет указывать класс записи).
Я использовал:
java -cp build/libs/org.amdatu.typescriptgenerator-1.0-SNAPSHOT.jar org.amdatu.typescriptgenerator.standalone.TypeScriptGeneratorStarter
Затем он должен жаловаться, что нет файла typescript.settings.json
, который он ожидает в директории, из которой вы запускаете команду.
Я включу свой собственный пример, потому что связанный файл настроек примера репо немного неясен:
{
"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
- это каталог, в который будут помещаться файлы определения TypeScript, относительно того, где вы выполняете генератор
-
packages
- это регулярное выражение java, для которого пакеты должны быть преобразованы в определения TypeScript
Ответ 3
В настоящее время я работаю над проектом с той же настройкой, что и ваш: API Java и веб-приложение Typescript.
Мы используем cz.habarta.typescript-generator.typescript-generator-maven-plugin
для генерации файлов .d.ts
при создании API. Файлы определения затем упаковываются как артефакт с <type>d.ts</type>
, используя org.codehaus.mojo.build-helper-maven-plugin
. Наконец, артефакт импортируется как зависимость в веб-приложении, где файлы определения распаковываются в каталог target
.
Для этой настройки требуется, чтобы вы использовали maven для веб-приложения, что не идеально, но это небольшая плата за автоматическое создание файлов определений.
Ответ 4
Как таковой, я хотел бы найти инструмент, способный преобразовать его из декларации интерфейса Java (через API отображения) в соответствующий интерфейс TypeScript.
Вы можете сначала взглянуть на эти образцы.
Я не переносил функцию java → TypeScript в автономный инструмент CLI (из всего проекта), но это легко сделать.
Ответ 5
Вы можете использовать Script4J, который представляет собой набор библиотек для кодирования в TypeScript с использованием Java API. Хотя это новый проект, он может быть полезен.
Ответ 6
Я создал новый проект с целью максимально упростить процесс переноса: JavaModel-Converter
Он работает с ide или просто из командной строки, выполняя jar файл в папке dist.
Все, что вам нужно, это поместить вашу Java-модель в нужную папку и начать процесс переноса.
Я добавил также поддержку стиля Angular.
Пусть открытые вопросы, если у вас есть запросы!
Теоретически мой проект - это общий конвертер моделей Java, но на самом деле поддерживается только транспонирование Typescript.