2016-02-24 1 views
1

У меня возникли проблемы, когда я использую сетку Ваадина с BeanItemContainer. Он отображает строку ОК, но когда я пытаюсь сохранить отредактированную строку он бросает:Vaadin grid save отредактировал проблему вопроса

java.lang.IllegalArgumentException: Given item id ([email protected]) does not exist in the container 
    at com.vaadin.ui.Grid$AbstractSelectionModel.checkItemIdExists(Grid.java:1367) 
    at com.vaadin.ui.Grid$SingleSelectionModel.select(Grid.java:1457) 
    at com.vaadin.ui.Grid$SingleSelectionModel$1.select(Grid.java:1442) 

Затем, если я снова нажмите кнопку Сохранить он бросает:

com.vaadin.data.fieldgroup.FieldGroup$CommitException: Property "organConductedCourse" not bound to datasource. 
    at com.vaadin.data.fieldgroup.FieldGroup.startTransactions(FieldGroup.java:557) 
    at com.vaadin.data.fieldgroup.FieldGroup.commit(FieldGroup.java:476) 
    at com.vaadin.ui.Grid.saveEditor(Grid.java:6817) 
    at com.vaadin.ui.Grid$4.save(Grid.java:4782) 

Мой код что-то вроде этого:

Grid grid = new Grid(); 
grid.setSizeFull(); 
grid.setEditorEnabled(true); 
BeanItemContainer<MyBean> container = new BeanItemContainer<>(MyBean.class); 
container.addBean(new MyBean()); 
grid.setContainerDataSource(container); 

Я не знаю, где я поступаю неправильно. Может быть, у вас есть идея. Спасибо за любые советы!

+3

Я нашел ответ после повторного поиска. Мне пришлось использовать BeanContainer вместо BeanItemContainer. Оказывается, BeanItemContainer использует хэш-код каждого элемента для идентификации элемента. Итак, hashCode() MyBean основан на поле, которое изменяется после редактирования. Тогда элемент не был найден, и «id объекта не существует в контейнере» была выбрана ошибка. –

+1

Ваш комментарий действительно помог мне поблагодарить вас – shinchillahh

+0

То же самое здесь. +1. Я даже не думал о том, чтобы посмотреть на HashCode для этой ошибки. – cbmeeks

ответ

1

Я нашел ответ после повторного поиска. Мне пришлось использовать BeanContainer вместо BeanItemContainer. Оказывается, что BeanItemContainer использует хэш-код каждого элемента для идентификации элемента. Таким образом, MyBeanhashCode() основан на поле, которое изменяется после редактирования. Тогда элемент не был найден, и «идентификатор элемента не существует в контейнере» была выбрана ошибка (так как никто не отвечал на этот вопрос, я принял свой комментарий, который является решением в качестве ответа, я надеюсь, что это поможет другим)

+1

Большое вам спасибо! Я смог по-прежнему использовать BeanItemContainer, редактируя мой метод hashCode() для использования двух идентификаторов, которые у меня есть на моих объектах. Вы просто решили три наших отладки. Вы сделали мой день! – Fabian