Отображение ошибок проверки GWT с помощью Editor Framework

Я делаю проверку на стороне клиента GWT, и у меня есть проблема, как показать ошибки проверки, которые возвращаются валидатором. Я его отлазил и вижу, что набор содержит ошибки, но драйвер их не показывает. Используется SimpleBeanEditorDriver.

Entry Entry = driver.flush();
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Entry>> violations = validator.validate(Entry, Default.class);
if (violations.size() > 0) {
   driver.setConstraintViolations(new ArrayList<ConstraintViolation<?>>(violations));
   ... 
}

Протестировано на GWT вер. 2.4 и 2.5

Код написан в соответствии с https://developers.google.com/web-toolkit/doc/latest/DevGuideValidation, но они не используют редакторы.

Кто-нибудь заставляет его работать вместе с проверкой GWT и редакторами? Может быть, кто-нибудь может дать ссылки на хорошие примеры этого? Я не нашел рабочих. Любая помощь приветствуется!


person Eugene    schedule 26.10.2012    source источник
comment
Используете ли вы какой-либо HasEditorErrors редактор?   -  person Thomas Broyer    schedule 26.10.2012
comment
Похоже, что нет. Я реализую только интерфейс Editor‹Entry›. Но проверка и отображение ошибок работали хорошо без реализации интерфейса HasEditorErrors, когда я использовал RequestFactoryEditorDriver.   -  person Eugene    schedule 26.10.2012
comment
Если вы не используете какой-либо редактор HasEditorErrors (только встроенный редактор ValueBoxEditorDecorator), то нет ничего, что могло бы обрабатывать ошибки, чтобы (возможно) отображать их. RequestFactoryEditorDriver не исключение.   -  person Thomas Broyer    schedule 26.10.2012
comment
Я взглянул на интерфейс и не уверен, какой код мне следует поместить в метод showErrors(List‹EditorError› editorErrors)? Похоже, что каждое поле должно быть внутри декоратора, и я должен вызывать fieldDecorator.showErrors(editorErrors) для каждого элемента управления в редакторе? Я прав?   -  person Eugene    schedule 26.10.2012


Ответы (2)


Вот простой пример того, как мы используем editors/HasEditorError и ConstraintViolations. Я также включил образец из нашего ValueBoxEditorDecorator, который позволяет нам размещать сообщения об ошибках.

Наша деятельность

 @Override
  public void onSave() {
    RequestFactoryEditorDriver<DashboardModelProxy, ?> driver = display.getDriver();
    RequestContext context = driver.flush();
    context.fire(new Receiver<Void>() {

      @Override
      public void onSuccess(Void response) {
        Place previousPlace = clientFactory.getPlaceController().getPreviousPlace();
        clientFactory.getPlaceController().goTo(previousPlace);
      }

      @Override
      public void onFailure(ServerFailure error) {
        display.showError(error.getMessage());
      }

      @Override
      public void onConstraintViolation(Set<ConstraintViolation<?>> violations) {
        display.getDriver().setConstraintViolations(violations);
      }
    });
  }

Образец с нашей точки зрения.

/**
 * Name component for the name of the analytics operation.
 * This also implements {@link HasEditorErrors so it can show
 * constraint violations when an error occurs.
 */
@UiField
ValueBoxEditorDecorator<String> name;

Пример UIBinder с использованием местоположения ошибки.

  <t:ValueBoxEditorDecorator errorLocation="RIGHT" ui:field="name">
            <t:valuebox>
                <g:TextBox />
            </t:valuebox>
  </t:ValueBoxEditorDecorator>

Используемый нами ValueBoxEditorDecorator.

import java.util.List;

import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.editor.client.EditorError;
import com.google.gwt.editor.client.HasEditorErrors;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.editor.client.adapters.TakesValueEditor;
import com.google.gwt.editor.ui.client.adapters.ValueBoxEditor;
import com.google.gwt.uibinder.client.UiChild;
import com.google.gwt.uibinder.client.UiConstructor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.ValueBoxBase;
import com.google.gwt.user.client.ui.ValueListBox;

/**
 * This is a copy of the original ValueBoxEditorDecorator in the gwt source The
 * reason we are not using it is because it did not support laying out the error
 * panel in a different location.
 * 
 * 
 * A simple decorator to display leaf widgets with an error message.
 * <p>
 * <h3>Use in UiBinder Templates</h3>
 * <p>
 * The decorator may have exactly one ValueBoxBase added though an
 * <code>&lt;e:valuebox></code> child tag.
 * <p>
 * For example:
 * 
 * <pre>
 * &#064;UiField
 * ValueBoxEditorDecorator&lt;String&gt; name;
 * </pre>
 * 
 * <pre>
 * &lt;e:ValueBoxEditorDecorator ui:field='name'>
 *   &lt;e:valuebox>
 *     &lt;g:TextBox />
 *   &lt;/e:valuebox>
 * &lt;/e:ValueBoxEditorDecorator>
 * </pre>
 * 
 * @param <T>
 *            the type of data being edited
 */

public class ValueListBoxEditorDecorator<T> extends Composite implements HasEditorErrors<T>, IsEditor<TakesValueEditor<T>> {

    /**
     * The location of the text relative to the paging buttons.
     */
    public static enum ErrorPanelLocation {
        LEFT, RIGHT;
    }

    SimplePanel contents = new SimplePanel();

    @Ignore
    Label errorLabel = new Label();

    HorizontalPanel layout = new HorizontalPanel();

    private TakesValueEditor<T> editor;

    /**
     * Constructs a ValueBoxEditorDecorator.
     */
    @UiConstructor
    public ValueListBoxEditorDecorator(ErrorPanelLocation errorLocation) {
        initWidget(layout);
        setStyleName("gwt-ValueBoxEditorDecorator");
        errorLabel.setStyleName("gwt-ValueBoxEditorDecorator-error");
        errorLabel.getElement().getStyle().setDisplay(Display.NONE);

        if (errorLocation == ErrorPanelLocation.RIGHT) {
            layout.add(contents);
            layout.add(errorLabel);
        } else {
            layout.add(errorLabel);
            layout.add(contents);
        }
    }

    /**
     * Constructs a ValueBoxEditorDecorator using a {@link ValueBoxBase} widget
     * and a {@link ValueBoxEditor} editor.
     * 
     * @param widget
     *            the widget
     * @param editor
     *            the editor
     */
    public ValueListBoxEditorDecorator(ValueListBox<T> widget, TakesValueEditor<T> editor) {
        this(ErrorPanelLocation.RIGHT);
        contents.add(widget);
        this.editor = editor;
    }

    /**
     * Returns the associated {@link ValueBoxEditor}.
     * 
     * @return a {@link ValueBoxEditor} instance
     * @see #setEditor(ValueBoxEditor)
     */
    public TakesValueEditor<T> asEditor() {
        return editor;
    }

    /**
     * Sets the associated {@link ValueBoxEditor}.
     * 
     * @param editor
     *            a {@link ValueBoxEditor} instance
     * @see #asEditor()
     */
    public void setEditor(ValueBoxEditor<T> editor) {
        this.editor = editor;
    }

    /**
     * Set the widget that the EditorPanel will display. This method will
     * automatically call {@link #setEditor}.
     * 
     * @param widget
     *            a {@link ValueBoxBase} widget
     */
    @UiChild(limit = 1, tagname = "valuebox")
    public void setValueBox(ValueBoxBase<T> widget) {
        contents.add(widget);
        setEditor(widget.asEditor());
    }

    public void clearErrors() {
        errorLabel.setText("");
        errorLabel.getElement().getStyle().setDisplay(Display.NONE);
    }

    /**
     * The default implementation will display, but not consume, received errors
     * whose {@link EditorError#getEditor() getEditor()} method returns the
     * Editor passed into {@link #setEditor}.
     * 
     * @param errors
     *            a List of {@link EditorError} instances
     */
    public void showErrors(List<EditorError> errors) {
        StringBuilder sb = new StringBuilder();
        for (EditorError error : errors) {
            if (error.getEditor().equals(editor)) {
                sb.append("\n").append(error.getMessage());
            }
        }

        if (sb.length() == 0) {
            clearErrors();
            return;
        }

        errorLabel.setText(sb.substring(1));
        errorLabel.getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
    }
}
person Chris Hinshaw    schedule 26.10.2012

Эта вики может вам помочь: https://github.com/apetrelli/gwt-integration/wiki/GWT-Integration-Editor, хотя он объединяет Editor, Validator и RequestFactory. Я создал архетип Maven, который его использует: https://github.com/apetrelli/samplegwt

person apetrelli    schedule 24.06.2014