我遵循类层次结构。
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
}
然后我根据正在编辑的实际类型选择编辑器。驱动程序正确刷新对象。但是当我显示约束违规时,每个违规在发送到小部件之前都会被复制,例如
“标题不能为空” “标题不能为空”</p>
更糟糕的是,如果我在一种形式中包含多个这样的小部件(带有 @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
}
解决方法是不要在 EditorB 中使用 EditorA,而是复制 EditorA 的所有小部件并粘贴到 EditorB.ui.xml 中,然后只设置单个违规(如预期的那样)。然而,这是很多代码重复,因为 EditorA 在现实中非常复杂。
这种编辑器设置有什么问题?我基本上遵循这里提到的指导方针:http: //www.gwtproject.org/doc/latest/DevGuideUiEditors.html#Very_large_objects
======更新=======
我进一步调试它(还没有成功)在 SimpleViolation.java 中,以下代码能够为 1 个属性找到 3 个匹配的委托:
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);
上面的 delegateList 有 2 或 3 个编辑器,具体取决于我的配置。可能的原因是因为 subType 可以访问所有 superType 属性,因此可以将 subType 编辑器驱动程序视为该属性的委托。SuperType 的编辑器本身就是一个代表。由于每个人都实施 Editor,因此每个人都有责任设置违规行为。对于涉及的每个编辑器,它将违规推送到多次显示违规的同一个文本框。
这是预期的吗?如果是,如何正确使用多态类型的编辑器框架并仅显示一次 ConstraintViolation?