Play 框架 (Java) 模型验证 - 对 create() 和 update() 的不同检查

Play framework (Java) model validation - different check for create() and update()

我正在使用 Play 2.3.7,我基本上有与 this 相同的问题,但我正在使用 Java 并且我不知道 Scala。

在我的例子中,我有一个 CSVData class 和一个 name 属性,我希望它是唯一的。在我针对 create()update(Long id) 的控制器操作中,我使用

将表单绑定到此 class
Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();

Play documentation 中所述,validate() 函数在 bindFromRequest() 上被调用。这是我当前的验证函数:

public List<ValidationError> validate() {

    List<ValidationError> errors = new ArrayList<ValidationError>();

    // Unique validation on name
    if(CSVData.find.where().eq("name", getName()).findRowCount() != 0) {
        errors.add(new ValidationError("name", "Name must be unique. That value is already taken."));
    }

    // other stuff

}

很明显,我当前的解决方案存在的问题是,当调用 update() 时,数据库中已经存在具有该名称的行。 This answer 建议检查控制器操作中对象的 id 属性,然后提供一个 Scala 代码片段,但该示例包含一个用户 class,而我的应用程序没有。如何检查数据库中匹配 name 的对象是否与我当前正在更新的对象相同?我应该在 validate() 函数中还是在我的控制器中检查这个?

创建两个单独的 classes,一个用于 insert() - InsertCsvData,一个用于 updated() - UpdateCsvData,具有两种不同的 validate() 实现.可选地,创建用于存储公共 properties/behaviours.

的基 class

无法在模型的 validate() 函数中对 create()update() 执行不同的验证,但您可以在各自的控制器操作中执行验证,如下所示

public static Result create() {

    Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();

}    

public static Result update() {

    Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();

    if( !formData.hasErrors() ){
        if(formData.field("name").value().equals( .... ) {
            // do some check here
            // add ValidationError if needed
        }
    }

}

我之前没有考虑过直接在控制器中执行验证,但这是可能的。