Как выполнить проверку на стороне клиента с аннотированными правилами для классов домена (RequestFactory)?

Я разрабатывал проект с 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

спасибо.

Edit: вот как это будет проверка на стороне клиента (не тестируется)...

@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();
}

2 ответов


лучший вариант, который я нашел-это ждать. Команда GWT все еще работает над проверкой на стороне клиента, и это должно закончиться летом.

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

комментарий участника проекта ncha...@google.com, 10 апреля 2012:

"У меня есть план, чтобы закончить реализацию этого лета спецификаций."

Как это приложение не имеет много входных данных, я решил сделать проверка только на сервере.


найдено (временное) решение для использования одинаковые аннотации проверки на клиенте и на сервере С 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, мы могли бы устранить этот класс и переместить аннотации в класс домена.