Как смоделировать POJO из пользовательского интерфейса Vaadin? (Лучшая практика)

Я работаю над генератором счетов в формате PDF в Vaadin 7. Код в его нынешнем виде на момент написания этой статьи можно найти здесь. Репо включает в себя грубую диаграмму классов.

Мой вопрос касается наилучшей практики сбора пользовательского ввода из TextField и других компонентов Vaadin для создания экземпляра Invoice.

В настоящее время это работает так:

  1. Когда пользователь нажимает кнопку для создания PDF-файла, класс VaadinInvoiceGui (панель) вызывает метод createPdf(VaadinInvoiceGui gui) в классе VaadinInvoiceController.
  2. VaadinInvoiceController вызывает метод getInvoiceFromForm (графический интерфейс VaadinInvoiceGui) в классе InvoiceMapperImpl.
  3. InvoiceMapperIml создает и возвращает счет-фактуру (POJO), вызывая методы get в переданном ему VaadinInvoiceGui. Эти геттеры возвращают значения компонентов в представлении.
  4. VaadinInvoiceController берет счет-фактуру, возвращенный InvoiceMapperImpl, и создает из него PDF-файл и т. д.

Геттеры в VaadinInvoiceGui выглядят так.

    public String getCustomerName() {
        return infoPanel.getCustomerNameTextField().getValue().toString();
    }

    public String getCustomerStreet() {
        return infoPanel.getCustomerStreetTextField().getValue().toString();
    }

    public String getCustomerCity() {
        return infoPanel.getCustomerCityTextField().getValue().toString();
    }

    ...

Мне действительно не кажется хорошей идеей передавать весь класс графического интерфейса контроллеру и особенно мапперу, но я не уверен, как это сделать лучше. Я мог бы изменить метод createPdf(VaadinInvoiceGui gui) на что-то вроде createPdf(String имя клиента, String customerStreet,...), но количество параметров метода стало бы огромным. Я мог бы сделать это с помощью сеттеров, но тогда это в основном будет выполнять сопоставление объектов в графическом интерфейсе, что тоже не кажется очень чистой идеей.

Каков правильный способ сделать это?


person Niklas    schedule 09.03.2014    source источник


Ответы (1)


Напишите bean-компонент для передачи данных в качестве вашей модели. Затем используйте FieldGroup для привязки модели к форме. Оберните модель как BeanItem<Model>. Привязка осуществляется либо по имени (условие), либо по аннотации @PropertyId.

master-detail-example: https://vaadin.com/wiki/-/wiki/Main/Creating+a+master-details+view+for+editing+persons

общая информация: https://vaadin.com/book/vaadin7/-/page/datamodel.html

привязка в формах: https://vaadin.com/book/vaadin7/-/page/datamodel.itembinding.html

person cfrick    schedule 10.03.2014