Используя FieldGroup
, у меня есть форма, связывающая все свойства Customer
с помощью BeanItem<Customer>
и отображающая их в FormLayout
.
Мой класс Customer
выглядит примерно так:
@Entity
@Table(name="customer")
public class Customer implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String description;
(... other fields ...)
private String language;
(... getters and setters ...)
}
Свойство language
является ярлыком для языка. Например "de"
, "en"
, "fr"
и так далее.
Кроме того, есть класс POJO с именем Language
(упрощенный код)
public class Language {
protected String shortCut;
public Language(String shortCut)
{
this.shortCut = shortCut;
}
public String getShortcut()
{
return this.shortCut;
}
}
... и статический список экземпляров (упрощенный код):
public static List<Language> LANGUAGES = new ArrayList<>(Arrays.asList(new Language[]{
new Language("de"),
new Language("fr"),
new Language("en")
}));
Наряду с данными клиента в макете формы я добавляю еще одно поле со списком, содержащее приведенный выше список языков.
Чего я хочу добиться, так это того, что при отправке формы язык, выбранный в поле со списком, берется, а его ярлык записывается в файл BeanItem
. псевдокод:
// Assuming we have a combobox and our customer bean, both created before and elsewhere:
ComboBox cmbLanguage;
BeanItem<Customer> customer;
// Then, the language chosen by the user is:
Language lang = (Language)cmbLanguage.getValue();
// So this should actually happen upon saving the form:
customer.getItemProperty("language").setValue(lang.getShortcut());
Я знаю, что можно вручную изменить объект bean-компонента клиента, используя обработчик фиксации в группе полей. Но я хотел бы избежать этого.
Есть ли способ сделать это «автоматически», реализуя конвертер или тому подобное в поле со списком, форме или элементе bean-компонента?
Изучив N. Презентация Франкеля "Vaadin 7 FieldGroup & Converter" (страницы с 18 по 21), я пробовал использовать собственный экземпляр Converter
. Но это, очевидно, не может работать, потому что связанное свойство не может быть одновременно набором/списком языков и языком клиента.
Как этого добиться?
Примечание. из-за совместимости я не могу изменить Customer
, и мне нужно использовать конструкцию с языковым классом.