是什么触发了GWT的验证?验证失败后会发生什么?

时间:2016-05-19 20:46:46

标签: java validation gwt

我对GWT验证的工作原理感到困惑。我已阅读此GWT Page on Validation,但我仍然不确定以下事项:

  • 何时进行验证?在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

1 个答案:

答案 0 :(得分:1)

您似乎错过了您链接的文档中的几个步骤 - “创建验证器工厂”显示了如何构建验证器,之后不久显示如何询问验证器是否实际有效。它看起来像这样:

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上?从服务器发送数据模型时 - &gt;客户?来自客户 - &gt;服务器

除非每个setter(或由于某种原因得到getter)实际上都调用了验证器,否则不会发生这种情况,并且不会导致异常,只是一组可能为空的错误。

如上所示,当您调用validator.validate(myBean)时会进行验证。服务器可以以更通用的方式支持这一点,并且您始终必须让服务器检查工作而不信任客户端(因为JS在用户的浏览器中运行,因此他们可以恶意地修改它)。因此,您的服务器在查看数据时也应运行相同的验证(可能还有更多)。

  

验证失败后会发生什么?是否抛出了运行时异常?

方法Validator.validate(bean, groups...)返回java.util.SetConstraintViolation个特定于您的bean的对象,这些对象指定每个错误的路径,消息以及验证程序提供的任何其他自定义数据。抛出没有异常,但您可以创建一个(已检查或运行时)并从代码中的某个位置抛出它。您可以考虑将此功能构建到您为每个表单使用的任何逻辑中,并在单击“保存”时调用它,或者每100ms调用一次 - 无论您的项目有什么意义。可能最简单的处理问题的方法是使用提供的路径以某种方式为用户突出显示错误。考虑使用编辑器框架的HasEditorErrors界面来帮助突出显示。