如何使用GWT编辑器框架进行validation?

我正在尝试与GWT 2.1.0的新GWT Editor框架集成。 我还想将validation检查添加到框架中。 但是,我正在努力寻找一个体面的例子来做到这一点。

目前我有以下代码:

           

对于我的编辑:

 public class GarageEditor extends Composite implements Editor { @UiField ValueBoxEditorDecorator personalReference; interface GarageEditorUiBinder extends UiBinder { } private static GarageEditorUiBinder uiBinder = GWT.create(GarageEditorUiBinder.class); public GarageEditor() { initWidget(uiBinder.createAndBindUi(this)); } } 

在什么时候我必须调用我的validation器,我该如何与它集成?

更新:

我实际上正在寻找一种方法来检索具有关键属性路径的地图,并作为编辑器的值。 委托上有一个路径字段,但这不是编辑对象中的路径,而是编辑器类中的路径。

有人知道是否有可能做这样的事情?

用conttricnts注释bean(参见Person.java )

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

使用标准validation引导程序在客户端上获取Validator并validation您的对象(请参阅ValidationView.java )

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

按照此模式为要在客户端上validation的对象创建validation器。 (参见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); } } 

包括validation提供程序的模块。 在gwt模块文件中添加replace-with标记,告诉GWT使用您刚刚定义的Validator(参见Validation.gwt.xml )

     

资源

我通过添加一个额外的DriverWrapper类来完成类似的操作,该类使用现有的Driver和Validator并添加一个flush方法,该方法首先委托给底层的Driver 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  the data type for the editor * @param  the driver type */ public class ValidationDriverWrapper, D extends EditorDriver> { private IValidator 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 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> errors = validator.validate(data); Set> extraErrors = data.validate(); if(extraErrors != null && !extraErrors.isEmpty()) { errors.addAll(extraErrors); } driver.accept(new InvalidConstraintValidationVisitor(errors)); } 

我有同样的问题。

文档不清楚。

我目前正在做的是通过使用我想复制的小部件扩展它们来重新创建一些小部件。 之后我实现了LeafValueEditor和HasEditorDelegate来覆盖getValue()。

在getValue()中,使用validation器并在需要时调用yourDelegate.recordError()。

像这样:一个小整数框,检查该值不大于10。

 public class IntegerField extends ValueBox implements LeafValueEditor, HasEditorDelegate { private EditorDelegate 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 delegate) { this.delegate = delegate; } } 

最好的方法是简单地将自定义validation添加到现有小部件而不是覆盖它们,但我不知道该怎么做!

GWT中还不存在validation,它将在下一个版本的AFAIK中出现。 GWT当前对validation的支持是服务器端JSR-303,客户端JSR-303支持即将推出。 因此,您必须手动进行validation。 如果你遵循MVP模型,我认为这个validation逻辑将存在于你的Presenter中。

这很乱,但要获得编辑器的路径,您可以实现HasEditorDelegate(它将允许您访问委托),然后将Delegate转换为AbstractEditorDelegate,它具有公共String getPath()方法。

我不认为可以进行外部validation; validation发生在编辑器中,从字段读取值(请参阅ValueBoxEditor – 此编辑器使用getDelegate()。recordError来引发错误)。 我考虑过的一个选项是使用AbstractEditorDelegate访问来调用flushErrors(List)并自己创建EditorErrors列表。 要做到这一点,你需要知道每个场路径; 对它们进行硬编码是不可取的,但我没有看到通过编辑的属性或类似的东西查找字段的方法。

可能需要考虑的另一种方法是使用requestfactory进行往返validation的提交:

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