2015-09-08 24 views
11

Tôi có một ứng dụng máy chủ Java, sử dụng Jackson để sắp xếp một cách tổng quát DTO bằng cách sử dụng API phản chiếu. Ví dụ cho giao diện DTO này:Tạo giao diện kiểu từ giao diện Java

package com.acme.library; 
public interface Book { 
    com.acme.library.Author getAuthor(); 
    String getTitle(); 
} 

Từ việc thực hiện POJO của giao diện này, Jackson sẽ quát serialize các thực thể sau:

{ 
    "author": { "name": "F. Scott Fitzgerald"}, 
    "title": "The Great Gatsby" 
} 

tải trọng này sẽ được nhận được bằng cách sử dụng HTTP GET từ ứng dụng nguyên cảo của tôi , đó là AngularJS dựa trên:

$http.get("http://localhost/books/0743273567") 
    .success((book: Book) => { ... }); 

Vì vậy mà tôi có thể sử dụng bản chất được đánh máy mạnh mẽ của TypeScript, tôi thấy mình tự tay mã hóa như sau giao diện kiểu chữ:

module com.acme.library { 
    export interface Book { 
     author: com.acme.library.Author; 
     title: String; 
    } 
} 

Kết quả là, tôi phải duy trì hai bản sao của cùng giao diện này - rất cồng kềnh. Điều này đặc biệt khó chịu, vì tôi muốn có cùng một bình luận javadoc/jsdoc trên cả hai giao diện, trong đó bao gồm toàn bộ đống bản sao dán &.


Tôi muốn tìm cơ chế để tự động hóa quá trình này.

Java là ngôn ngữ phát triển chính của tôi. Như vậy, tôi muốn tìm một số công cụ có khả năng chuyển đổi từ việc khai báo giao diện Java (thông qua API phản chiếu?) Thành giao diện TypeScript có liên quan.

Công cụ duy nhất tôi đã phát hiện trong miền này là gói NPM ts-java. Tuy nhiên, điều này là quá nặng đối với trường hợp sử dụng của tôi. Nó thêm các phương thức từ hệ thống phân cấp Đối tượng vào mỗi giao diện, ví dụ: hashCode(), wait(), getClass(), v.v.

+1

Tôi hiện đang tìm kiếm điều này. Bạn đã tìm thấy một cái gì đó thú vị? – iberbeu

+2

@iberbeu - không sợ – jwa

Trả lời

2

Tôi hiện đang làm việc trên một dự án có cùng thiết lập như bạn: một API Java và ứng dụng web Loại bản ghi.

Chúng tôi đang sử dụng cz.habarta.typescript-generator.typescript-generator-maven-plugin để tạo các tệp .d.ts khi chúng tôi tạo API. Các tệp định nghĩa sau đó được đóng gói như một tạo phẩm với <type>d.ts</type>, sử dụng org.codehaus.mojo.build-helper-maven-plugin. Cuối cùng, tạo phẩm được nhập dưới dạng phụ thuộc trong ứng dụng web, nơi các tệp định nghĩa được giải nén vào thư mục target.

Thiết lập này yêu cầu bạn sử dụng maven cho ứng dụng web, điều này không lý tưởng, nhưng đó là một mức giá nhỏ để trả cho các tệp định nghĩa được tạo tự động.

6

Bạn có thể sử dụng typescript-generator làm larslonne được đề cập. Nó tạo ra các giao diện TypeScript từ các lớp Java JSON.Một số tính năng bạn có thể thấy hữu ích:

  • Maven và Gradle plugin (cũng có thể được gọi trực tiếp từ Java)
  • Jackson 1 và Jackson 2
  • bộ sưu tập, sự đếm, thừa kế, Generics
  • ý kiến ​​Javadoc để JSDoc bình luận
  • tài liệu chi tiết (README, Wiki, Maven plugin)
  • phiên trong Maven repo trung ương
.210

Dưới đây là ví dụ làm thế nào để sử dụng nó từ 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> 

Chỉnh sửa: Chạy nó sử dụng mvn process-classes hoặc sử dụng sau giai đoạn như mvn install.
Bạn cũng có thể kéo <configuration> phần tử hai cấp lên và chạy mvn typescript-generator:generate.

Chỉnh sửa: Tôi là tác giả của trình tạo bản ghi.

+0

Tôi cố gắng để chạy dự án mẫu nhưng tôi đã nhận được lỗi sau: Mô tả \t Resource \t Đường dẫn \t Location \t Loại không thể tìm thấy vật cz.habarta.typescript-máy phát điện: nguyên cảo-phát-maven- plugin: jar: 1.7-SNAPSHOT \t pom.xml \t/test \t dòng 1 \t Maven pom Đang tải sự cố –

+0

@DorCohen thay thế 1,7-SNAPSH‌ OT bằng phiên bản mới nhất trong kho lưu trữ trung tâm của maven https://repo1.maven.org/maven2/ cz/habarta/typescript-generator/kiểu chữ-generator-maven-plugin. Hiện tại nó là 1.10.220. – Vojta

+0

Khi tôi cập nhật lên 1.10.220 I, m nhận được lỗi sau: Thực thi plugin không được bao gồm trong cấu hình vòng đời: cz.habarta.typescript-generator: trình tạo mã lệnh-generator-maven-plugin: 1.10.220: tạo (thực hiện: tạo, giai đoạn: quá trình-lớp học) –

2

Tôi có may mắn lớn với Amdatu TypeScript Generator

Nó có thể chạy trong Gradle hoặc độc lập từ các thiết bị đầu cuối (tôi đã sử dụng thiết bị đầu cuối, vì vậy đó là những gì các hướng dẫn ở đây là)

Đơn giản chỉ cần sao chép các repo, chạy ./gradlew để xây dựng nó. Để thực hiện nó, tôi đã phải chệch hướng một chút từ hướng dẫn của họ bởi vì không có điểm vào trong lọ (bạn sẽ không gặp vấn đề này nếu bạn sử dụng một build gradle, bởi vì nó sẽ chỉ định class entry).

tôi đã sử dụng:

java -cp build/libs/org.amdatu.typescriptgenerator-1.0-SNAPSHOT.jar org.amdatu.typescriptgenerator.standalone.TypeScriptGeneratorStarter 

Nó sau đó nên phàn nàn rằng không có một tập tin typescript.settings.json, mà nó mong đợi trong thư mục bạn đang chạy các lệnh từ.

tôi sẽ bao gồm ví dụ của riêng tôi vì tập tin cài đặt ví dụ repo liên kết là một chút không rõ ràng:

{ 
    "folder" : "/projectsfolder/project", 
    "classFolder" : "target/classes", 
    "output" : "typscriptOutputDirectory", 
    "baseFolder" : "", 
    "clearOutput" : false, 
    "packages" : [ 
    ".*regexforwhatpackagesinsidetargetprojectshouldbeturnedintotypescript.*" 
    ], 
    "excludePackages" : [ ], 
    "excludePattern" : [ ], 
    "types" : { }, 
    "mapping" : { }, 
    "enumType" : "class", 
    "classType" : "interface", 
    "classPath" : [ ] 
} 

Các lĩnh vực quan trọng nhất trong các thiết lập như sau:

  • folder là nơi của bạn Dự án đã được xây dựng
  • classFolder là nơi trình tạo này sẽ xem bên trong thư mục đó cho các lớp java đã biên dịch
  • output là thư mục chứa các file định nghĩa nguyên cảo sẽ được đặt, liên quan đến nơi bạn đang thực hiện các máy phát điện
  • packages là một regex java cho những gì gói nên được biến thành nguyên cảo các định nghĩa
0

As such, I'd like to find some tool which is capable of converting from the Java interface declaration (via the reflection API?) to the relevant TypeScript interface.

Trước tiên, bạn có thể xem these samples. Tôi đã không chuyển chức năng java java -> typescript thành công cụ CLI độc lập (từ toàn bộ dự án) nhưng dễ thực hiện điều đó.

Các vấn đề liên quan