我想知道在我想要的时候是否可以忽略播放标准验证。例如,让我们假设我有一个名为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
然后,任何解决方案?谢谢大家
答案 0 :(得分:2)
我读了Play for Java书。
6.4.2部分验证
一个常见的用例是对同一个对象有多个验证约束 模型。因为我们在对象模型上定义了约束,所以它是正常的 多个表单,指向同一个对象模型。但这些形式可能有所不同 验证约束。为了说明这个用例,我们可以想象一个简单的向导 用户通过两个步骤输入新产品:
我们可以在步骤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。