Как использовать среду редактора 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:
Я действительно ищу способ получить карту с ключом пути свойства и как значение редактора. На делетете есть поле пути, но это не путь в отредактированном объекте, а путь в классе редактора.
Кто-нибудь знает, можно ли сделать что-то вроде этого?
Ответы
Ответ 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