У меня есть макет с несколькими компонентами (4 текстовых поля и 2 выпадающих списков). Это, как определенно:Показать имя объекта недвижимости, а не id
private ManufacturerRepository manRepo;
InteriorDoor interiorDoor;
Manufacturer manufacturer;
ComponentHelper componentHelper;
@PropertyId("width")
private TextField widthField;
@PropertyId("height")
private TextField heightField;
@PropertyId("thickness")
private TextField thicknessField;
@PropertyId("modelName")
private TextField modelName;
@PropertyId("hasGlass")
private ComboBox glassCombo;
@PropertyId("manufacturerId")
private ComboBox manCombo;
private BeanItemContainer<Manufacturer> beanItemContainer;
beanItemContainer
используется для извлечения данных из базы данных:
beanItemContainer = new BeanItemContainer<>(Manufacturer.class, manRepo.findAll());
manCombo.setContainerDataSource(beanItemContainer);
не возражает о glassCombo
, поскольку он имеет постоянные данные и обязательные работы там хорошо.
Это, как я связать поля:
// binding data to fields
BeanFieldGroup binder = new BeanFieldGroup<>(InteriorDoor.class);
binder.setItemDataSource(interiorDoor);
binder.setBuffered(false);
binder.bindMemberFields(this);
до сих пор так хорошо, но когда это происходит с проводниковой полей, речь идет о большой проблеме с manCombo
- при выборе пункта из выпадающего списка, я получаю это
Вызванный: com.vaadin.data.util.converter.Converter $ ConversionException: не удалось преобразовать значение Long в com.vaadin.ui.AbstractField.convertToModel (AbstractField.java:778) ~ [Vaadin-сервер -7.7.5.jar: 7.7.5] на com.vaadin. ui.AbstractField.convertToModel (AbstractField.java:755) ~ [vaadin-server-7.7.5.jar: 7.7.5] at com.vaadin.ui.AbstractField.setValue (AbstractField.java:539) ~ [vaadin- server-7.7.5.jar: 7.7.5] ... 49 общих кадров опущено Вызвано: com.vaadin.data.util.converter.Converter $ ConversionException: невозможно преобразовать значение типа .domain.Manufacturer для модели type class java.lang.Long. Преобразователь не установлен, и типы несовместимы. на com.vaadin.data.util.converter.ConverterUtil.convertToModel (ConverterUtil.java:182) ~ [vaadin-server-7.7.5.jar: 7.7.5] на com.vaadin.ui.AbstractField.convertToModel (AbstractField.java:775) ~ [Vaadin-сервера 7.7.5.jar: 7.7.5] ... 51 общие рамки опущена
Пожалуйста, помогите
PS Я пытался бросить в (((Manufacturer).getValue).getId()
но он не оказывает никакого эффекта
ОБНОВЛЕНИЕ 1
Решение @Marco C не работает. Теперь на вызове раскладку я получаю это:
java.lang.NullPointerException: нуль на java.lang.Class.isAssignableFrom (метод Native) ~ [на: 1.8.0_121] на com.vaadin.data. util.converter.ConverterUtil.canConverterPossiblyHandle (ConverterUtil.java:243) ~ [vaadin-server-7.7.5.jar: 7.7.5] at com.vaadin.ui.AbstractField.setPropertyDataSource (AbstractField.java:649) ~ [vaadin-server-7.7.5.jar: 7.7.5] в com.vaadin.data.fieldgroup.FieldGroup.bind (FieldGroup.java:272) ~ [vaadin-server-7.7.5.jar: 7.7 .5] в com.vaadin.data.fieldgroup.BeanFieldGroup.bind (BeanFieldGroup.java:155) ~ [vaadin-server-7.7.5.jar: 7.7.5] at com.vaadin.data.fieldgroup.FieldGroup.buildAndBindMemberFields (FieldGroup.java:1011) ~ [vaadin-server-7.7.5.jar: 7.7.5] на com.vaadin.data.fieldgroup.FieldGroup.bindMemberFields (FieldGroup.java:856) ~ [vaadin-server-7.7.5.jar: 7.7.5] на com.reborn.doorshop.ui .components.InteriorEditor.editEntity (InteriorEditor.java: 156) ~ [classes /: na] at com.reborn.doorshop.ui.views.InteriorView.lambda $ initComponents $ 61446b05 $ 1 (InteriorView.java:53) ~ [classes /: na] на солнце. reflect.NativeMethodAccessorImpl.invoke0 (Родной Метод) ~ [па: 1.8.0_121] на sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
Update2:
manCombo.setConverter(new Converter<Object, Long>() {
@Override
public Long convertToModel(Object value, Class<? extends Long> targetType, Locale locale)
throws ConversionException {
if (value == null) {
return null;
}
return ((Manufacturer)value).getId();
}
@Override
public Object convertToPresentation(Long value, Class<?> targetType, Locale locale)
throws ConversionException {
if (value == null) {
return null;
}
return beanItemContainer.getItemIds().stream().filter(m -> value.equals(m.getId()))
.findFirst().orElse(null);
}
@Override
public Class<Long> getModelType() {
return null;
}
@Override
public Class<Object> getPresentationType() {
return null;
}
});
Странно, что это не работает. Я попробовал, и все в порядке. Из stacktrace кажется ** getModelType ** в конвертере возвращает null. Можете ли вы опубликовать код конвертера? –
Он выглядит так же, как и вы. Я попробовал несколько вариантов. Вы уверены, что должно быть только два метода override, а не четыре? – Reborn
Извините, отредактировал мой ответ. Все методы должны быть реализованы, я оставил их на образце кода –