我想知道在我想要的时候是否可以忽略播放标准验证。例如,让我们假设我有一个名为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
那么,任何解决方案?谢谢大家
我读了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;
}
然后,在控制器
// We re//strict the validation to the Step1 "group"
Form<Product> productForm =
form(Product.class, Product.Step1.class).bindFromRequest();
谢谢!
是的,您可以实现此问题的解决方案。在这种情况下发生的是每次将您的请求映射到模型汽车时,它总是会查找每个属性的JPA验证,然后它会查找该模型中存在的validate()方法,如果该方法返回null则它不会传递任何错误并执行正常执行,但如果它返回任何内容,则将其映射到表单错误。您可以将错误映射返回到特定字段,或者只返回一个将被视为全局错误的字符串。
在您的情况下解决方案是:
@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验证并使用验证功能中的逻辑来根据情况进行检查。
忽略验证,如下所示:
myCarForm.discardErrors().get();
然后进行验证,例如Jquery。