Как использовать редакторскую среду GWT для проверки? - PullRequest
19 голосов
/ 04 ноября 2010

Я пытаюсь интегрироваться с новой платформой GWT Editor в GWT 2.1.0. Я также хочу добавить свои проверки в рамках. Однако я изо всех сил пытаюсь найти достойный пример, как это сделать.

На данный момент у меня есть следующий код:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:e="urn:import:com.google.gwt.editor.ui.client">
    <ui:with type="be.credoc.iov.webapp.client.MessageConstants"
        field="msg" />
    <g:HTMLPanel>
        <e:ValueBoxEditorDecorator ui:field="personalReference">
            <e:valuebox>
                <g:TextBox />
            </e:valuebox>
        </e:ValueBoxEditorDecorator>
    </g:HTMLPanel>
</ui:UiBinder> 

А для моего редактора:

public class GarageEditor extends Composite implements Editor<Garage> {

    @UiField
    ValueBoxEditorDecorator<String> personalReference;

    interface GarageEditorUiBinder extends UiBinder<Widget, GarageEditor> {
    }

    private static GarageEditorUiBinder uiBinder = GWT.create(GarageEditorUiBinder.class);

    public GarageEditor() {
        initWidget(uiBinder.createAndBindUi(this));
    }

}

В какой момент мне нужно вызывать мой валидатор и как мне с ним интегрироваться?

Обновление:

Я на самом деле ищу способ получить карту, используя в качестве ключа путь к свойству и в качестве значения редактор. У делегата есть поле пути, но это не путь в редактируемом объекте, а путь в классе редактора.

Кто-нибудь знает, возможно ли сделать что-то подобное?

Ответы [ 5 ]

8 голосов
/ 11 февраля 2011

Аннотируйте ваши bean-компоненты с помощью contstrants (см. Person.java )

public class Person {
  @Size(min = 4)
  private String name;
}

Используйте стандартный загрузчик проверки для получения Validator на клиенте и проверки вашего объекта (см. ValidationView.java )

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Person>> violations = validator.validate(person);

Следуйте этому шаблону, чтобы создать Validator для объектов, которые вы хотите проверить на клиенте.(см. SampleValidatorFactory.java )

public final class SampleValidatorFactory extends AbstractGwtValidatorFactory {

  /**
   * Validator marker for the Validation Sample project. Only the classes listed
   * in the {@link GwtValidation} annotation can be validated.
   */
  @GwtValidation(value = Person.class,
      groups = {Default.class, ClientGroup.class})
  public interface GwtValidator extends Validator {
  }

  @Override
  public AbstractGwtValidator createValidator() {
    return GWT.create(GwtValidator.class);
  }
}

Включите модуль для вашего поставщика валидации.Добавьте тэг замены в свой файл моделирования gwt, говорящий GWT об использовании только что определенного вами Валидатора (см. Validation.gwt.xml )

<inherits name="org.hibernate.validator.HibernateValidator" />
<replace-with
    class="com.google.gwt.sample.validation.client.SampleValidatorFactory">
    <when-type-is class="javax.validation.ValidatorFactory" />
</replace-with>

Источник

2 голосов
/ 12 августа 2011

Я сделал нечто похожее на это, добавив дополнительный класс DriverWrapper, который берет существующие Driver и Validator и добавляет метод flush, который сначала делегирует базовый драйвер flush, а затем вызывает Validator.Любые возвращенные ошибки затем добавляются в редакторы с помощью нового посетителя, аналогично тому, как работает существующий Flusher.Это означает, что существующие декораторы, которые отображают ошибки рядом с полями, продолжают работать.

/**
 * Wraps a Driver and provides validation using gwt-validation (JSR 303).
 * When calling flush, this will use the provided IValidator to validate the data
 * and use the InvalidConstraintValidationVisitor to add the errors to the delegates.
 * @see InvalidConstraintValidationVisitor
 * @param <T> the data type for the editor
 * @param <D> the driver type
 */
public class ValidationDriverWrapper<T extends IsValidatable<T>, D extends EditorDriver<T>> {
private IValidator<T> validator;
private D driver;

/**
 * Constructor, both parameters are required.
 * @param driver The driver to use to flush the underlying data.
 * @param validator The validator to use to validate the data.
 */
public ValidationDriverWrapper(D driver, IValidator<T> validator) {
    this.validator = validator;
    this.driver = driver;
}

/**
 * Flushes the underlying Driver and then calls the validation on the underlying Validator, cascading errors as EditorErrors
 * onto the delegates, using InvalidContraintValidationVisitor.
 */
public void flush()
{
    T data = driver.flush();
    Set<InvalidConstraint<T>> errors = validator.validate(data);
    Set<InvalidConstraint<T>> extraErrors = data.validate();
    if(extraErrors != null && !extraErrors.isEmpty())
    {
        errors.addAll(extraErrors);
    }
    driver.accept(new InvalidConstraintValidationVisitor<T>(errors));
}
1 голос
/ 12 ноября 2010

У меня точно такая же проблема.

Документация по этому вопросу не ясна.

В настоящее время я воссоздаю некоторые виджеты, расширяя их виджетом, который я хочу скопировать. После этого я реализую LeafValueEditor и HasEditorDelegate для переопределения getValue ().

В getValue () используйте свой валидатор и при необходимости вызовите yourDelegate.recordError ().

Примерно так: маленькое целочисленное поле, которое проверяет, что значение не больше 10.

public class IntegerField extends ValueBox<Integer> implements LeafValueEditor<Integer>, HasEditorDelegate<Integer>
{
private EditorDelegate<Integer> delegate;

public IntegerField()
{
    super(Document.get().createTextInputElement(), IntegerRenderer.instance(), IntegerParser.instance());

    setStyleName("gwt-TextBox");

}

@Override
public Integer getValue()
{
    Integer value = super.getValue();

    if (value > 10)
    {
        delegate.recordError("too big integer !", value, null);
    }

    return value;
}

@Override
public void setValue(Integer value)
{
    super.setValue(value);
}

@Override
public void setDelegate(EditorDelegate<Integer> delegate)
{
    this.delegate = delegate;
}
}

Лучший подход - просто добавить пользовательскую проверку к существующим виджетам, а не переопределять их, но я не знаю, как это сделать!

0 голосов
/ 10 февраля 2011

Это грязно, но чтобы получить путь к редактору, вы можете реализовать HasEditorDelegate (который даст вам доступ к делегату), а затем привести делегат к AbstractEditorDelegate, который имеет публичный метод String getPath ().

Я не думаю, что возможно провести внешнюю проверку; проверка происходит в редакторе в момент, когда значение считывается из поля (см. ValueBoxEditor - этот редактор использует getDelegate (). recordError, чтобы вызвать ошибку). Одним из вариантов, который я рассмотрел, было использование доступа AbstractEditorDelegate для вызова flushErrors (List) и для создания этого списка EditorErrors самостоятельно. Для этого вам нужно знать каждый из ваших полевых путей; жесткое их кодирование вряд ли желательно, но я не вижу способа поиска поля по отредактированному свойству или что-то в этом роде.

Альтернативный подход, на который можно обратить внимание, - это представление для проверки в оба конца с использованием фабрики запросов:

http://groups.google.com/group/google-web-toolkit-contributors/browse_thread/thread/5be0bda80547ca5a

0 голосов
/ 06 ноября 2010

Проверка в GWT еще не существует, она появится в следующем выпуске AFAIK. В настоящее время поддержка проверки в GWT осуществляется на стороне сервера JSR-303, а поддержка на стороне клиента JSR-303 скоро появится. Поэтому вам придется выполнить проверку вручную. Если вы следуете модели MVP, я думаю, что эта логика проверки будет жить в вашем Presenter.

...