19

GWT2.1.0の新しいGWTエディターフレームワークと統合しようとしています。また、検証チェックをフレームワークに追加したいと思います。しかし、私はこれを行う方法のまともな例を見つけるのに苦労しています。

今のところ私は次のコードを持っています:

<!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));
    }

}

どの時点でバリデーターを呼び出す必要があり、どのようにそれと統合するのですか?

アップデート:

私は実際に、キーとしてプロパティパスを使用し、値としてエディターを使用してマップを取得する方法を探しています。デリゲートにはパスフィールドがありますが、これは編集されたオブジェクト内のパスではなく、エディタークラス内のパスです。

このようなことが可能かどうか誰かが知っていますか?

4

5 に答える 5

8

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);

このパターンに従って、クライアントで検証するオブジェクトのバリデーターを作成します。(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 modleファイルにreplace-withタグを追加して、定義したばかりのバリデーターを使用するように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>

ソース

于 2011-02-11T07:46:37.157 に答える
2

既存のドライバーとバリデーターを取得する追加のDriverWrapperクラスを追加し、最初に基になるドライバーフラッシュに委任してからバリデーターを呼び出すフラッシュメソッドを追加することで、これと同様のことを行いました。返されたエラーは、既存の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));
}
于 2011-08-12T05:31:10.860 に答える
1

私はexaclty同じ問題を抱えています。

ドキュメントはそれについて明確ではありません。

私が現在行っているのは、コピーしたいウィジェットでウィジェットを拡張して、いくつかのウィジェットを再作成することです。その後、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;
}
}

最善のアプローチは、既存のウィジェットにカスタム検証を追加し、それらをオーバーライドしないことですが、その方法がわかりません。

于 2010-11-12T14:22:52.577 に答える
0

検証はGWTにはまだ存在していませんが、次のリリースのAFAIKで提供される予定です。GWTでの検証の現在のサポートは、サーバー側のJSR-303であり、クライアント側のJSR-303のサポートは間もなく開始されます。したがって、検証は手動で行う必要があります。MVPモデルに従う場合、この検証ロジックはプレゼンターに存在すると思います。

于 2010-11-06T00:22:29.923 に答える
0

面倒ですが、エディターのパスを取得するには、HasEditorDelegate(デリゲートへのアクセスを提供します)を実装してから、パブリックString getPath()メソッドを持つAbstractEditorDelegateにデリゲートをキャストします。

ただし、外部検証を行うことはできないと思います。検証は、フィールドから値が読み取られた時点でエディターで行われます(ValueBoxEditorを参照してください-このエディターはgetDelegate()。recordErrorを使用してエラーを発生させます)。私が検討したオプションの1つは、AbstractEditorDelegateアクセスを使用してflushErrors(List)を呼び出し、EditorErrorsのリストを自分で作成することでした。そのためには、各フィールドパスを知る必要があります。それらをハードコーディングすることはほとんど望ましくありませんが、編集されたプロパティなどでフィールドを検索する方法がわかりません。

調査する必要があるかもしれない別のアプローチは、requestfactoryを使用した往復検証のためのこの提出です:

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

于 2011-02-10T16:57:20.657 に答える