GWT Editor Framework для полиморфных типов
У меня следующая иерархия классов.
class A {
String id;
@NotEmpty(message="Title can't be empty")
String title;
String description;
String comments;
}
class B extends A {
String manufacturer;
}
class C extends A {
long size;
}
Теперь мне нужен редактор, который повторно использует редактор A, а также хорошо работает со значениями B и C. Поэтому я продолжил:
class EditorA extends Composite implements Editor<A> {
@uiField
TextBox id;
@uiField
TextBox title;
@uiField
TextBox description;
// .. constructor etc
}
class EditorB extends Composite implements Editor<B> {
@Path(“”)
@UiField
EditorA editorA;
@UiField
TextBox manufacturer;
public interface Driver extends SimpleBeanEditorDriver<B, EditorB>{}
// .. initialization
}
class EditorC extends Composite implements Editor<C> {
@Path(“”)
@UiField
EditorA editorA;
@UiField
LongBox size;
public interface Driver extends SimpleBeanEditorDriver<C, EditorC>{}
// .. initialization
}
затем я выбираю редактор на основе редактируемого фактического типа. Водитель правильно очищает объект. Но когда я показываю нарушения ограничений, каждое нарушение дублируется перед отправкой в виджеты, например
"Заголовок не может быть пустым" "Заголовок не может быть пустым"
Хуже того, если я включу несколько таких виджетов (с аннотацией @Path("")) в одну форму, нарушения будут увеличиваться. поэтому в приведенной ниже настройке установлено 3 нарушения.
class EditorAFooter extends Composite implements Editor<A> {
@UiField
TextBox comments;
}
class EditorB extends Composite implements Editor<B> {
@Path(“”)
@UiField
EditorA editorA;
@UiField
TextBox manufacturer;
@Path(“”)
@UiField
EditorAFooter editorAFooter;
public interface Driver extends SimpleBeanEditorDriver<B, EditorB>{}
// .. initialization
}
Обходной путь - не использовать EditorA внутри EditorB, вместо этого скопируйте все виджеты EditorA и вставьте их в EditorB.ui.xml, и тогда будут установлены только отдельные нарушения (как и ожидалось). Однако, это много дублирования кода, так как EditorA довольно сложен в реальности.
Что не так с такой настройкой редактора? Я в основном придерживаюсь указаний, упомянутых здесь: http://www.gwtproject.org/doc/latest/DevGuideUiEditors.html
====== Обновление =======
Я продолжил отладку (пока безуспешно) В SimpleViolation.java следующий код может найти 3 подходящих делегатов для 1 свойства:
public static void pushViolations(Iterable<SimpleViolation> violations,
EditorDriver<?> driver, KeyMethod keyMethod) {
if (violations == null) {
return;
}
DelegateMap delegateMap = DelegateMap.of(driver, keyMethod);
// For each violation
for (SimpleViolation error : violations) {
Object key = error.getKey();
List<AbstractEditorDelegate<?, ?>> delegateList = delegateMap.get(key);
У делегата списка выше есть 2 или 3 редактора в зависимости от моей конфигурации. Вероятная причина в том, что у subType есть доступ ко всем свойствам superType, поэтому драйвер редактора subType можно считать делегатом для этого свойства. Редактор SuperType сам по себе является делегатом. Поскольку каждый реализует Редактор, каждый отвечает за установку нарушений. Для каждого задействованного редактора он помещает нарушение в одно и то же текстовое поле, которое показывает нарушение несколько раз.
Это ожидается? Если да, как правильно использовать Framework редактора для полиморфных типов и отображать ConstraintViolation только один раз?