簡體   English   中英

如何保持服務器端Java和客戶端JS DTO屬性的一致性

[英]how to keep server side Java and client side JS DTO properties consistent

嗨,我正在尋找Eclipse中的解決方案/插件,以保持服務器端Java DTO屬性和它們的客戶端JSON對應在整個代碼庫的演變過程中保持一致。 例如,對於具有Java后端的webapp,通過REST接口(使用Jackson)公開API,webapp可能在服務器上有類似的東西:

DTO:

public class Person {
    private String firstName;
    private String lastName;
    public Person(String string, String string2) {
        firstName = string; lastName = string2;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

REST服務:

@Path("/data")
public class PersonService {
    @GET
    @Path("persons")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Person> getAssets() {
        List<Person> persons = new ArrayList<Person>();
        persons.add(new Person("Jimmy", "Hendrix"));
        persons.add(new Person("Roger", "Waters"));
        return persons;
    }
}

在客戶端,在Javascript / JQuery中,我們可以使用以下代碼:

$.ajax('/data/persons/', function(data){ for(var i = 0; i < data.length; i++){ var firstName = data[i].firstName; var lastName = data[i].lastName; //do some stuff to populate the view with the person data } });

這一切都很簡單。 但是,隨着代碼庫的發展和變化(一如既往),假設需要將DTO字段的名稱從“firstName”和“lastName”更改為“foreName”和“surName”。

在Eclipse中,使用Refactor菜單項重構所有Java代碼很簡單,該菜單項將在Java代碼中找到方法/字段的所有引用,並替換它們。 請注意,Eclipse的“Refactor ...”與“查找/替換”操作不同。 查找/替換會對指定的所有文件執行基本文本替換。 另一方面,重構考慮到Java是強類型編程語言,並搜索具有該簽名的所有方法調用。

如果有一些插件或Eclipse功能足夠聰明,可以在Javascript代碼中更改對“firstName”和“lastName”的引用,那將是很棒的。 這樣可以節省開發人員只需要為Java代碼執行Refactor,然后在Javascript代碼中進行選擇性查找/替換,並減少潛在的運行時錯誤。 有誰知道這樣的工具/插件是否存在?

我也是。 這似乎是我在每個工作中遇到的模式。

我過去做過的最好的事情是從java DTO生成Javascript存根,並使用JsDoc來指示這些javascript DTO的使用位置。

如果我今天也在做同樣的解決方案,我可能會看到Swagger codegen會給我開箱即用的東西。

Intellij至少會突出顯示javascript中缺少的字段,這很有幫助。

如果有一個插件會很棒,但這總比沒有好。

使用打字稿,您甚至可以使用存根獲得編譯安全性。

對於您在問題中提供的JavaScript代碼段,這樣的工具可能無法編寫。

但是,您可以采取一些措施來改善這種情況。

一方面,您可以為DTO的JavaScript表示編寫生成器。 IDE友好的策略是生成具有默認值屬性的對象。 喜歡

var Person = { firstName: "", lastName: "", roles:[] };

即使您沒有將這樣的文件主動集成到實際的Web UI中,也可以通過檢查IDE將向您發出的警告來減少拼寫錯誤。

另一方面,您可以/應該使用真正的JavaScript模型層。 然后,您可以在自動化測試期間驗證所有DTO JavaScript表示和/或在QA始終在發布之前驗證的UI的維護部分中使用特殊按鈕。 如果您將Web UI與服務器一起升級,它肯定有助於捕獲錯過的重構剩余部分。

驗證端點將收到如下的JSON對象:

 { "Person": {...}, "Address": {...}, "Item": {...}, ... } 

並使用一些Java反射,使用DTO對包進行運行。 當然,您也可以使用Java中的Nashorn引擎直接在服務器上進行驗證,例如在服務器啟動期間。

它不是一個銀彈,它只是極大地幫助減少錯誤。 最后,UI中的邏輯不那么模糊,重構更容易。 創建或使用通用的通用組件,將它們連接到使用標簽查找表的非常薄的轉換層中的DTO,這也可以進行驗證。 也有助於i18n。

生成和驗證可以在一個項目中單獨使用或一起使用。

BTW,幾年前為UI層選擇GWT的原因之一就是實現你想要的。 我有一段時間沒有關注它,但很難想象它的缺點將超過這個好處。

沒有這樣的插件。 歡迎來到非靜態類型的語言世界。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM