Използвайки 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. Презентацията на Frankel „Vaadin 7 FieldGroup & Converter“ (страници 18 до 21), опитах с потребителски екземпляр на Converter
. Но това очевидно не може да работи, защото обвързаното свойство не може да бъде и двете, наборът/списъкът от езици и езикът на клиента.
Как да постигнете това?
Забележка: поради оперативна съвместимост не мога да променя Customer
и трябва да използвам конструкцията с езиковия клас.