Как реализовать редактор GWT с подредакторами

Я пытаюсь создать редактор GWT для объекта bean, который имеет два поля другого типа объекта, поэтому мне нужны подредакторы для этих полей. Проблема в том, что я новичок в среде редакторов, и я не совсем понимаю все эти интерфейсы редактора. Посоветуйте лучшее решение. Мои идеи были следующими: использовать драйверы подредакторов для передачи данных драйверу главного редактора; или используйте какой-нибудь CompositeEditor (но я не знал, что делать с переопределенными методами...). Вот пример кода:

public class A {

    String s1, s2;
    Integer i;
    Double d;
    B ba, bb;

}

public class B {

    BigDecimal a, b;
}

//sub-editor
public class BEditor extends Composite implements Editor<B> {

    interface BDriver extends BeanEditorDriver<B, BEditor> {
    }

    //implements HasEditorErrors interface
    ValueBoxEditorDecorator<BigDecimal> a, b;
}

//main editor
public class AEditor extends Composite implements Editor<A> {

    interface ADriver extends BeanEditorDriver<A, AEditor> {
    }

    private ADriver driver = GWT.create(ADriver.class);

    ValueBoxEditorDecorator<String> s1, s2;
    ValueBoxEditorDecorator<Integer> i;
    ValueBoxEditorDecorator<Double> d;
    BEditor ba, bb;

    public AEditor() {
        driver.initialize(this);
        driver.edit(new A());
    }

    //called when the editor form is submitted
    public void onSubmit() {

        driver.clearErrors();
        A a = driver.flush();
        // A has both B fields = null
        // AEditor successfully displays validation errors, 
        // but BEditors do not display errors, nor does 
        // ADriver get any errors from BEditor
    }  
}

}


person ahumellihuk    schedule 16.01.2014    source источник


Ответы (2)


Когда вы создаете VehiculeDTO, также создайте подклассы B:

A a = new A();
a.setBa(new B());
a.setBb(new B());
driver.edit(a);
person Patrice De Saint Steban    schedule 16.01.2014
comment
… и вам не нужно EditorDriver в BEditor! - person Thomas Broyer; 16.01.2014
comment
Хорошо, теперь я заполнил поля B, хотя они не прошли проверку. Как заставить ADriver собирать все ошибки проверки? - person ahumellihuk; 17.01.2014
comment
Спасибо за Ваш ответ! Я узнал, почему моя проверка не работала - мне не хватало аннотации @Valid для проверки, чтобы пометить поле как каскадный объект. - person ahumellihuk; 17.01.2014

Вот несколько рекомендаций, основанных на моем опыте использования Editor Framework как лично, так и в отрасли. Я изо всех сил старался сделать их актуальными для вашего примера.

  • Определите своего редактора «верхнего уровня». В вашем случае это будет AEditor — в большинстве других случаев это будет представление. Пусть назначенный виджет реализует интерфейс редактора с типом param = ваш вспомогательный объект (что вы сделали правильно).
  • Убедитесь, что ваш резервный объект A включает геттеры и сеттеры, а поля являются закрытыми. Вы оставили им доступ по умолчанию, что я не думаю, что это хорошая идея.
  • Убедитесь, что ваш виджет верхнего уровня содержит вспомогательный редактор для каждого из полей в A. Они должны иметь то же имя, что и соответствующее поле в A, или иметь аннотацию @Path, чтобы указать, к какому полю они относятся.
  • Ваши субредакторы никогда не должны иметь собственный интерфейс драйвера. Они должны либо реализовать LeafValueEditor, ValueAwareEditor и т. д., либо интерфейс адаптера, такой как IsEditor.
  • В конструкторе вашего редактора верхнего уровня (здесь AEditor) вам нужно инициализировать драйвер и вспомогательный объект:
  • ADriver driver =  GWT.create(ADriver.class);
    public AEditor {
        driver.initialize(this);
        driver.edit(new A());
    }
    

  • Когда вы сохраняете, вы должны вызывать driver.flush() для перемещения данных из редактора верхнего уровня в резервный объект. И наоборот, когда вы загружаете, вы должны вызывать driver.edit() с резервным объектом, который вы хотите загрузить.
  • Я разместил несколько Gists для демонстрации LeafValueEditor и IsEditor на случай, если вам понадобится помощь в изменении вашего вспомогательного редактора:

    LeafValueEditor

    Редактор

    person Nabil_H    schedule 16.09.2015