8

我一直在使用 GWT 2.4 开发一个项目,并寻找一种方法来验证(JSR 303)我的客户端(代理)类,而无需从我的域类(服务器端)重新创建注释。我知道有一个带有 GWT 中继代码(验证)的示例,但它不使用 RequestFactory,它使用 RPC。

是否可以从客户端的域类中进行验证?与客户端代码共享我的域模型是否是最佳策略?

据我所知,GWT 团队正在 2.3 和 2.4 上开发此功能。它已经完成了,还是我应该等待 GWT 2.5?

这已经发布在 GWT 论坛上,但仍然没有答案。

https://groups.google.com/forum/#!msg/google-web-toolkit/au_GCy_9WZQ/6296p5TcWdoJ

谢谢。

编辑:这就是在客户端验证的方式(未经测试)......

@UiHandler("save")
void onSave(ClickEvent event) {
    Modulo modulo = new Modulo(); //domain class
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<Modulo>> violations = validator.validate(modulo, Default.class);
    delegate.saveClicked();
}
4

2 回答 2

4

找到了一个(临时)解决方案,可以在客户端和带有 RequestFactory的服务器上使用相同的验证注释:

将 JSR 303 注释放在由代理接口(客户端)和域类(服务器)实现的单独接口中。当然,这个接口必须在共享包中。

由于验证注释将自动向下传递继承层次结构,验证现在应该在客户端和服务器上工作。

例子

以下是用户尝试注册时使用的对象示例:

UserProxyValid是包含 JSR 303 验证注释的通用接口:

public interface UserProxyValid  {

  @NotBlank(
      groups = {ClientGroup.class, ServerGroup.class})
  @UniqueEmail(
      groups = {ServerGroup.class})
  String getEmail();

  @NotBlank(
      groups = {ClientGroup.class, ServerGroup.class})
  @Size(
      min = 4, max = 25,
      groups = {ClientGroup.class, ServerGroup.class})
  String getPassword();
}

User是服务器上的域类:

public class User implements UserProxyValid {

  private String email;
  private String password;

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }
}

最后UserProxy是客户端:

@ProxyFor(value = User.class)
public interface UserProxy extends ValueProxy, UserProxyValid {

  String getEmail();
  void setEmail(String email);

  String getPassword();
  void setPassword(String password);
}

团体

通过,我们可以确保单独的验证要么在客户端上完成,要么仅在服务器上完成,或者同时在两者上完成。(和上面的例子一样,电子邮件唯一性的验证只能在服务器上完成。)

这是您在客户端上验证对象的方式:

Validator clientValidator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<UserProxy>> violations = clientValidator.validate(userProxy, ClientGroup.class);

以下是在服务器上进行验证的方式:

Validator serverValidator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<User>> violations = serverValidator.validate(user, ServerGroup.class);

对未来的希望

当然,如果没有额外的UserProxyValid类会更好。因此,一旦 Google 提供了BeanValidation的更新,我们就可以消除该类并将注释移至域类。

于 2012-05-18T21:14:05.627 回答
4

我发现最好的选择是等待。GWT 团队仍在进行客户端验证,预计将在夏季结束。

http://code.google.com/p/google-web-toolkit/wiki/BeanValidation

项目成员 ncha...@google.com 的评论,2012 年 4 月 10 日:

“我计划在今年夏天完成规范的实施。”

由于此应用程序没有太多输入数据,因此我选择仅在服务器上进行验证。

于 2012-05-14T19:47:24.823 回答