Playframework 分离表单备份和数据库备份模型。什么是有效的方法

Playframework 分离表单备份和数据库备份模型。什么是有效的方法,playframework,playframework-2.2,Playframework,Playframework 2.2,在过去的几天里,我读了很多关于play示例建议构建play应用程序的方式的文章/评论/问题。示例建议使用相同的模型/类来支持数据库和表单。但我有一个问题。表单篡改和混乱代码,以处理来自提交表单的更新(仅限于模型的某些字段)。。。 但当我寻找这些问题的解决方案时,我经常会遇到一些github isues,play core团队指出,使用同一类进行表单备份和数据库的人是他们自己的错。()他们的评论暗示我们应该使用单独的模型进行表单备份和数据库。 同样,这与例子所说的完全相反 所以“我”想出了一个“解

在过去的几天里,我读了很多关于play示例建议构建play应用程序的方式的文章/评论/问题。示例建议使用相同的模型/类来支持数据库和表单。但我有一个问题。表单篡改和混乱代码,以处理来自提交表单的更新(仅限于模型的某些字段)。。。 但当我寻找这些问题的解决方案时,我经常会遇到一些github isues,play core团队指出,使用同一类进行表单备份和数据库的人是他们自己的错。()他们的评论暗示我们应该使用单独的模型进行表单备份和数据库。 同样,这与例子所说的完全相反

所以“我”想出了一个“解决方案”(在读了这篇伟大的文章之后)

这就是我的方法

假设我有一个用户模型。用户有一些应该由用户编辑的字段(因此他们应该进入表单)和一些不应该由简单表单编辑的字段,如“isAdmin”或创建/修改等

所以我创造了一个正常的游戏!用户类,包括所有需要的字段,以及实体注释等。与普通类一样,但没有验证

除此之外,我还创建了一个“UserFormModel”。这是一个POJO,没有任何实体/数据库注释/属性,但带有验证(注释和validate()方法)

现在,我的应用程序使用这个UserFormModel在表单中表示用户。它具有来自实际用户的字段子集。 现在,即使是表单篡改也不能影响后端用户类中的非公共字段。这样做的缺点是,每次我想为用户显示/处理表单时,都必须将数据从UserFormModel传输到实际的用户类。对于小字段,这不是问题

对于这次转移,我实现了一个

public static User makeInstance(UserFormModel formData) {
    User user;
    if (formData.id != null) {
        user = findById(formData.id);
        user.setTestString(formData.testString);
    } else {
        user = new User();
    }
    return user;
}
在从表单模型创建用户的用户类中(更新现有的on(id存在)或实例化新的on)

UserFormModel也是如此

    public UserFormModel prefillFormModel(User user) {
    this.id = user.getId();
    this.testString = user.getTestString();
    this.jobs = user.getJobs();
    this.mails = user.getMails();
    return this;        
}
这将使用实际用户的“public”字段预先填充Formbacking模型

你认为这种方法怎么样

作为一种改进,如果UserFormModel实际上只有来自实际用户的字段子集,那么我正在考虑使用反射来获取从一个模型到另一个模型的数据。 在我想从UserFormModel创建一个User对象的情况下,我可以迭代UserFormModel中的所有公共字段,并调用实际用户的适当setter(如果它遵循JavaBeans约定,我可以从字段的名称推断setter的名称) 这将减少每个模型中来回传输数据所需的样板代码


编辑:在我为此睡了一个晚上之后,我想到了一个问题:谁能用嵌套表单处理这种设计方法。假设我想编辑一个用户,同时添加一些新的邮件对象。对于普通播放,这不是问题,因为我的用户有一个字段列表,所以它知道如何处理它,包括@Valid注释。但是当我有一个UserFormModel时,就会出现一个问题,因为它同样只知道邮件模型,它没有用于验证的注释(因为我想将数据域对象与表单模型分离)。我该怎么办?!在UserFormModel中声明List而不是List,并让转换回到实际用户模型的mail setter方法中的真实邮件?我认为这会起作用,但它会增加大量的混乱….

这是一个很难解决的问题。RubyonRails也有类似的表单支持模型方法。但在动态语言中,调整和自定义更容易


你的方法似乎很合理。您可以使用反射或代码生成来编写字段复制代码。注释适用于大多数验证,但Play还将寻找一个validate()方法,您可以在其中放置自定义validation代码。

知道我应该如何处理嵌套模型吗?比如我想在用户表单中创建一个新邮件对象?!因为当我在UserFormModel中使用@Valid时,邮件数据模型中没有验证,因为我应该使用表单模型。所以这就绕过了我的想法,在处理用户输入时只使用表单模型。有什么建议吗?我想我只是决定采用“标准”方法。将我的数据模型也用于表单备份。正如示例中所示。这更容易。尽管我可能需要在控制器中加入一些额外的逻辑来进行验证(不是实际的输入验证,而是围绕它的东西)。