Ich habe folgende Klassenhierarchie.
%Vor%Jetzt möchte ich einen Editor, der Editor von A wiederverwendet und auch gut mit Werten von B und C funktioniert. Also ging ich weiter mit:
%Vor%Dann wähle ich den Editor basierend auf dem tatsächlichen Typ, der bearbeitet wird. Der Treiber leert das Objekt korrekt. Aber wenn ich Constraint-Verletzungen zeige, wird jeder Verstoß dupliziert, bevor er an Widgets gesendet wird, z.
"Titel darf nicht leer sein" "Titel darf nicht leer sein"
Schlimmer noch, wenn ich mehrere solche Widgets (mit @Path ("") Annotation) in einem Formular einfüge, werden die Verletzungen immer größer. In der folgenden Konfiguration sind 3 Verstöße festgelegt.
%Vor%Problemumgehung ist nicht, EditorA in EditorB zu verwenden, stattdessen alle Widgets von EditorA kopieren und in EditorB.ui.xml einfügen und dann werden nur einzelne Verletzungen (wie erwartet) gesetzt. Dies ist jedoch eine Menge Code-Duplizierung, da EditorA in Wirklichkeit ziemlich komplex ist.
Was ist falsch an dieser Art von Editor-Setup? Ich folge im Wesentlichen den hier genannten Richtlinien: Ссылка
====== Aktualisierung =======
Ich debuggte weiter (noch kein Erfolg) In SimpleViolation.java kann der folgende Code drei übereinstimmende Delegaten für eine Eigenschaft finden:
%Vor%DelegateList oben hat 2 oder 3 Editoren, abhängig von meiner Konfiguration. Der wahrscheinlichste Grund ist, dass subType Zugriff auf alle SuperType-Eigenschaften hat, sodass der SubType-Editor-Treiber als ein Delegat für diese Eigenschaft betrachtet werden kann. Der SuperType-Editor ist selbst ein Delegierter. Da jeder Editor implementiert, ist jeder für das Setzen von Verstößen verantwortlich. Für jeden betroffenen Editor wird die Verletzung in dasselbe Textfeld verschoben, das die Verletzung mehrmals anzeigt.
Wird das erwartet? Wenn ja, wie kann man das Editor-Framework für polymorphe Typen korrekt verwenden und ConstraintViolation nur einmal anzeigen?
Tags und Links gwt java gwt-editors