2016-02-24 21 views
1

我在使用Vaadin的網格與BeanItemContainer時遇到了一些問題。它顯示的一行行,但是當我嘗試保存編輯後的行會拋出:Vaadin網格保存編輯項目問題

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使用每個Item的hashCode來標識該項目。所以,MyBean的hashCode()是基於編輯後更改的字段。然後找不到項目,並且「容器中不存在項目標識」錯誤被拋出。 –

+1

您的評論真的幫助我,謝謝 – shinchillahh

+0

同樣在這裏。 +1。我甚至沒有考慮過看這個錯誤的HashCode。 – cbmeeks

回答

1

我發現一個答案後,再次搜索。我不得不使用BeanContainer而不是BeanItemContainer。事實證明,BeanItemContainer使用每個項目的hashCode來標識項目。因此,MyBeanhashCode()基於編輯後更改的字段。然後沒有找到項目,並且「容器中不存在項目ID」錯誤(由於沒有人回答這個問題,我將我的評論作爲解決方案作爲答案,我希望它可以幫助其他人)

+1

非常感謝!我仍然可以通過編輯我的hashCode()來使用BeanItemContainer - 使用兩個標識符的方法,我在我的Objects上使用它。你剛剛解決了三個我們的調試問題。你讓我今天一整天都感覺很好! – Fabian