Hi,
I have what to me, is a simple requirement and from looking at the Book of Vaadin (Address book tutorial especially) I cannot see where I am going wrong.
Requirement
: I am using a BeanItemContainer to display POJO contents in a Table. Works fine for simple beans. However, I have some beans that have nested items that need to be displayed.
For example, class Company, has a public method called getName() which returns (scarily) the company name.
I am adding my nested properties like this:
for (String field : getTableColumns()) // Add any nested properties...
if (field.contains("."))
cont.addNestedContainerProperty(field) ;
The method
getTableColumns()
returns the Bean properties to display in the table. Which in this case, is a
Collection
object.
I’ve defined the property as follows:
“company.name”
The method
getCompany()
returns an instance of
Company
, and the
Company
instance has a method of "
getName()
"
Problem
: I am getting the following error when I attempt to create the table:
Caused by: java.lang.NoSuchMethodException: net.surame.data.JobRole.areCompany()
If I remove the "
name
" portion of the property and just leave "
company
" as the property (the Company object has an appropriate toString() method), I then get this error:
Caused by: java.lang.IllegalArgumentException: Ids must exist in the Container or as a generated column , missing id: company
What is really throwing me is the "
areCompany()
" method call. Is there some bean pattern for nested properties that I am not complying with? And in the second case, the method is there, although the object may be null. Is that the issue?
I’m sure I am making a silly mistake, so if anyone can shed some light on this, it would be much appreciated.
Thanks in advance,
Anthony
PS: I am using Vaadin 6.8
PPS: The method that sets the table up is as follows:
protected Table setupTable (final Table table, Collection<T> data)
{
if (null != table)
{
table.setSelectable(true) ;
table.setImmediate(true) ;
table.setNullSelectionAllowed(false);
if (null != data)
{
BeanItemContainer<T> cont = new BeanItemContainer<T> (getBeanClass()) ;
table.setContainerDataSource(cont ) ;
for (String field : getTableColumns()) // Add any nested properties...
if (field.contains("."))
cont.addNestedContainerProperty(field) ;
for (T item : data)
cont.addBean(item) ;
Object[] cols = null ;
if (null != getTableColumns() )
cols = getTableColumns().toArray() ;
if (null != cols && cols.length > 0)
table.setVisibleColumns(cols) ;
}
table.addListener(new Property.ValueChangeListener()
{
private static final long serialVersionUID = -4293185642035773779L;
@SuppressWarnings("unchecked")
public void valueChange(ValueChangeEvent event)
{
item = (T) table.getValue() ;
if (null != item)
{
btnEditContent.setEnabled(true) ;
btnDeleteContent.setEnabled(true) ;
}
}
});
}
return table ;
}