我对GWT的验证工作方式感到困惑。我已经阅读了关于验证的GWT页面,但我仍然不确定以下内容:
-
何时进行验证?在getter/setter上?数据模型何时从服务器->客户端发送?从客户端->服务器?
-
验证失败时会发生什么?是否引发运行时异常?
假设我有以下类:
package com.sixtyfootersdude.gwt.model;
public class Dog implements Serializable {
@NotEmpty
private String name;
public Dog () {
}
public void setName (String name){
this.name = name;
}
public String getName (){
return this.name;
}
}
myDog.name
在什么点可以为空或为空?例如,假设我创建了一个这样的新狗:
Dog myDog = new Dog();
// Presently, myDog.name is null.
myDog.setName("Santa");
// Validation should now pass, but I am not sure if it is invoked here.
myDog.setName(null);
// Validations should now fail, but I am not sure if it is invoked here.
// What would I need to do to trigger validation? When would validation be invoked?
附加信息:
- GWT 2.5和GWT 2.7
您似乎错过了链接文档中的几个步骤——"创建验证器工厂"展示了如何构建验证器,之后不久展示了如何询问验证器给定对象是否真的有效。它看起来像这样:
public final class SampleValidatorFactory extends AbstractGwtValidatorFactory {
/**
* Validator marker for the Validation Sample project. Only the classes and groups listed
* in the {@link GwtValidation} annotation can be validated.
*/
@GwtValidation(Dog.class)
public interface GwtValidator extends Validator {
}
@Override
public AbstractGwtValidator createValidator() {
return GWT.create(GwtValidator.class);
}
}
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Person>> violations = validator.validate(myDog);
//do something with those violations, if any
何时进行验证?在getter/setter上?数据模型何时从服务器->客户端发送?从客户端->服务器?
除非每个setter(或出于某种原因getter)都实际调用了验证器,否则这不会发生,也不会导致异常,只是一组可能为空的错误。
如上所示,当您调用validator.validate(myBean)
时,将进行验证。服务器可以以更通用的方式支持这一点,并且您必须始终让服务器检查工作,而不信任客户端(因为JS在用户的浏览器中运行,所以他们可以恶意修改它)。因此,当您的服务器看到数据时,也应该运行这些相同的验证(可能更多)。
验证失败时会发生什么?是否引发运行时异常?
方法Validator.validate(bean, groups...)
返回ConstraintViolation
对象的java.util.Set
,这些对象特定于您的bean,指定每个错误、消息和验证器提供的任何其他自定义数据的路径。虽然您可以创建一个异常(检查或运行时),并从代码中的某个位置抛出它,但不会抛出任何异常。您可以考虑将此功能构建到用于每个表单的任何逻辑中,并在单击"保存"时调用它,或者每100毫秒调用一次,这对您的项目来说是有意义的。处理问题的最简单方法可能是使用提供的路径以某种方式为用户突出显示错误。考虑使用编辑器框架的HasEditorErrors
接口来帮助突出显示。