忽略不同视图下的播放框架表单错误

时间:2014-06-30 20:00:05

标签: forms validation playframework

我想知道在我想要的时候是否可以忽略播放标准验证。例如,让我们假设我有一个名为Car的实体,就像

一样
@Entity
public class Car{

   @Id
   private Long id;

   @Required
   private String model;

   @Required
   private String hiddenField; //important but doesn't appear in some cases (some usecases)

}

为了更清楚,那么

案例1

@(carForm : Form[Car])
@import helper._

@form(routes.controller.foo.bar) {
    @inputText(carForm("model"))
    <input type="submit">
}

案例2

@(carForm : Form[Car])
@import helper._

@form(routes.controller.foo.bar) {
    @inputText(carForm("model"))
    @inputText(carForm("hiddenField"))
    <input type="submit">
}

然后我有一个Play.data.Form对象,它有错误因为我没有填充模型或者作为exmple给出的hiddenField。但是,实际上,我有一些情况,这隐藏甚至不出现(案例1),我的意思是,没有输入调用,因为用户不允许在那个时间编辑它。所以,如果我有两个用例,在第一个,所有输入都在那里,它们应该被填充,但另一个没有'hiddenField'输入,但是,altought,它仍然是我的模型所需要的,并且当然,没有它提交的表格也有错误,我该怎么办?我怎么应该处理它?我有一个模型,但验证在一种情况下可能会有所不同,我希望它是服务器端,而不是jquery,也不是纯粹的javascript。

我试图通过丢弃错误 (想象一下,它是从案例1中提交的)

MyForm<Car> myCarForm = Form.form(Car.class).bindFromRequest();
//it has errors, sure it does, hiddenField was required and that field didn't even exist at screen.
myCarForm.discardErrors(); //ok, error hashmap is empty right now
myCarForm.get(); // anyway, no value here.
//myCarForm.data(); //for sure i could retrieve field by field and remount object that way, but that looks hacky and hardworking

然后,任何解决方案?谢谢大家

3 个答案:

答案 0 :(得分:2)

我读了Play for Java书。

6.4.2部分验证

一个常见的用例是对同一个对象有多个验证约束 模型。因为我们在对象模型上定义了约束,所以它是正常的 多个表单,指向同一个对象模型。但这些形式可能有所不同 验证约束。为了说明这个用例,我们可以想象一个简单的向导 用户通过两个步骤输入新产品:

  • 1用户输入产品名称并提交表单。
  • 2用户输入产品EAN编号和说明。

我们可以在步骤2中验证产品的名称,但会显示错误消息 那时的产品名称会很奇怪。幸运的是,Play允许您执行 部分验证。对于每个带注释的值,我们需要指出它在哪一步 适用。我们可以借助我们的注释中的groups属性来做到这一点。 让我们改变我们的产品模型类来做到这一点:

public Product extends Model {
public interface Step1{}
public interface Step2{}
@Required(groups = Step1.class)
public String name;
@Required(groups = Step2.class)
public String ean;
}

然后,在Controller

// We re//strict the validation to the Step1 "group"
Form<Product> productForm =
form(Product.class, Product.Step1.class).bindFromRequest();

谢谢!

答案 1 :(得分:1)

是的,您可以解决此问题。在这种情况下发生的是每次将您的请求映射到模型汽车时,它总是会查找每个属性的JPA验证,然后它会查找该模型中存在的validate()方法,如果该方法返回null则它不会#39; t传递任何错误并执行正常执行,但如果它返回任何内容,则将其映射到表单错误。 您可以将错误映射返回到特定字段,或者只返回一个将被视为全局错误的字符串。

在你的情况下,解决方案是:

@Entity
public class Car{

   @Id
   private Long id;

   private String model;

   private String hiddenField; //important but doesn't appear in some cases (some usecases)

   public List<ValidationError> validate() {
    List<ValidationError> errors = new ArrayList<ValidationError>();
            .
            .
            .
            #Some logic to validate fields#
            #if field invalid#
                 errors.add(new ValidationError("model", "errorMessage"));
            .
            .
            .

            return errors.isEmpty() ? null : errors;
}

注意:只需删除JPA验证并使用验证功能中的逻辑来根据情况进行检查。

答案 2 :(得分:0)

忽略验证,如下所示:

myCarForm.discardErrors().get();

,否则进行验证,例如Jquery。