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

时间:2015-03-06 06:20:05

标签: java validation playframework playframework-2.3

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

在我的情况下,我有一个CSVData类,其中name属性我想要是唯一的。在create()update(Long id)的控制器操作中,我使用

将表单绑定到此类
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()被调用时,DB中已经有一行具有该名称。 This answer建议检查控制器操作中对象的id属性,然后提供Scala代码段,但该示例包含User类,而我的应用程序则不包含。如何检查数据库中具有匹配name的对象是否与我当前正在更新的对象相同?我应该在validate()功能或我的控制器中检查这个吗?

2 个答案:

答案 0 :(得分:0)

insert()创建两个单独的类 - InsertCsvData,为updated() - UpdateCsvData创建一个具有两个不同validate()实现的类。 (可选)创建用于存储公共属性/行为的基类。

答案 1 :(得分:0)

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

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
        }
    }

}

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