11

我遵循类层次结构。

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?

4

0 回答 0