【问题标题】:how to keep server side Java and client side JS DTO properties consistent如何保持服务器端 Java 和客户端 JS DTO 属性一致
【发布时间】:2015-08-21 12:41:52
【问题描述】:

您好,我正在寻找 Eclipse 中的解决方案/插件,以在整个代码库的演变过程中保持服务器端 Java DTO 属性及其客户端 JSON 对应项的一致性。例如,对于具有 Java 后端的 Web 应用程序,其 API 通过 REST 接口(使用 Jackson)公开,该 Web 应用程序可能在服务器上具有以下内容:

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 的“重构……”与查找/替换操作不同。 Find/Replace 对所有指定的文件进行基本的文本替换。另一方面,重构考虑到 Java 是一种强类型编程语言,并搜索具有该签名的所有方法调用。

如果有一些插件或 Eclipse 功能足够聪明,可以在 Javascript 代码中更改对“firstName”和“lastName”的引用,那就太好了。这将节省开发人员只需对 Java 代码进行重构,然后在 Javascript 代码中选择性地查找/替换的时间,并减少潜在的运行时错误。有谁知道这样的工具/插件是否存在?

【问题讨论】:

    标签: java javascript json eclipse rest


    【解决方案1】:

    对于你在问题中提出的 JavaScript sn-p,这样的工具可能是不可能写出来的。

    但是,您可以采取一些措施来改善这种情况。

    一方面,您可以为 DTO 的 JavaScript 表示形式编写生成器。 IDE 友好的策略是生成具有默认值属性的对象。喜欢

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

    即使您没有主动将此类文件集成到实际的 Web UI 中,它也有助于通过检查 IDE 向您抛出的警告来减少拼写错误。

    另一方面,您可以/应该使用真正的 JavaScript 模型层。然后,您可以在自动化测试期间验证所有 DTO JavaScript 表示和/或使用特殊按钮,例如UI 的维护部分,QA 总是在发布前验证。如果您将 Web UI 与服务器一起升级,肯定有助于捕捉错过的重构剩余部分。

    验证端点会收到这样的 JSON 对象:

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

    并使用一点 Java 反射对带有 DTO 的包运行它。当然,您也可以使用 Java 中的 Nashorn 引擎直接在服务器上进行验证,例如在服务器启动期间。

    这不是灵丹妙药,它只是极大地帮助减少错误。最后,UI 中的逻辑越模糊,重构就越容易。创建或使用通用的通用组件,将它们连接到一个非常薄的转换层中的 DTO,该转换层使用标签查找表,也可以进行验证。也有助于 i18n。

    生成和验证可以单独使用,也可以在一个项目中一起使用。

    顺便说一句,几年前为 UI 层选择 GWT 的原因之一就是为了实现您想要的。我已经有一段时间没有关注它了,但是很难想象它的缺点会超过这个好处。

    【讨论】:

      【解决方案2】:

      是的,我也是。这似乎是我在每项工作中都会遇到的一种模式。

      我过去做过的最好的事情是从 java DTO 生成 Javascript 存根,并使用 JsDoc 来指示这些 javascript DTO 的使用位置。

      如果我今天做同样的解决方案,我可能会看到 Swagger 代码生成会为我提供开箱即用的功能。

      Intellij 至少会突出显示 javascript 中缺少的字段,这很有帮助。

      如果有插件就好了,但总比没有好。

      使用 typescript,您甚至可以通过存根获得编译安全性。

      【讨论】:

        【解决方案3】:

        没有这样的插件。欢迎来到非静态类型语言的世界。

        【讨论】:

          猜你喜欢
          • 2018-03-03
          • 2015-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多