繁体   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