Подтвердить что ты не робот

Как использовать среду редактора GWT для проверки?

Я пытаюсь интегрироваться с новой редакцией 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));
    }

}

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

Update:

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

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

4b9b3361

Ответ 1

Аннотировать вас beans с помощью конкурсантов (см. Person.java)

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

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

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

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

Включите модуль для своего поставщика проверки. Добавьте тег replace-with в файл gwt modle, в котором GWT использует только что определенный Validator (см. 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

Я сделал что-то похожее на это, добавив дополнительный класс DriverWrapper, который использует существующий драйвер и средство проверки, и добавляет метод 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));
}

Ответ 3

У меня проблема с той же проблемой.

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

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

В getValue() используйте свой валидатор и вызовите, если необходимо, вашDelegate.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;
}
}

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

Ответ 4

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

Ответ 5

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

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

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

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