Search code examples
jsf-2primefaces

Initializing primefaces datatable rowkey


I have a primefaces datatable that I'm populating with properties of objects in an ArrayList once the user clicks a search button. I need to add a column with a radio button so that the user can select a row of the table to update. I'd like to set the rowkey to be the metadataKey property of my objects, but I get the following error:

rowKey="#{result.metadataKey}": Property 'metadataKey' not found on type java.lang.String

I believed that this was caused by the metadataKey not existing at the time the table is rendered. To remedy it, I set the table to render only after the user had completed their search, but this resulted in the same error.

Here is the relevant html:

<h:form id="dataForm">
    <p:panel styleClass="centered">
        <p:messages id="message" showDetails="true" autoUpdate="true" />
        <p:outputLabel id="searchLabel" value="Search for Metadata:  " />&nbsp;&nbsp;&nbsp;
                <p:inputText id="search"
            value="#{updateMetadataItemsBean.searchTerm}" />&nbsp;&nbsp;&nbsp;
                <p:commandButton id="searchButton" value="Search" 
            action="#{updateMetadataItemsBean.search}"
            update="dataForm:metadataitems, message, dataForm:dataPanel" />
        <br />
        <br />
        <br />
    </p:panel>
    <p:panel styleClass="center" id="dataPanel" >
        <p:dataTable id="metadataitems" var="result"
            value="#{updateMetadataItemsBean.results}" styleClass="center"
            resizableColumns="true"
            selection="updateMetadataItemsBean.selectedMetadataItem"
            rowKey="#{result.metadataKey}" rendered="#{updateMetadataItemsBean.show}">              
            <p:column headerText="Select Item to Update" selectionMode="single"></p:column>
            <p:column headerText="Metadata Key">
                <h:outputText value="#{result.metadataKey}" />
            </p:column>
            <p:column headerText="Map Name">
                <h:outputText value="#{result.mapName}" />
            </p:column>
            <p:column headerText="Metadata Name">
                <h:outputText value="#{result.metadataName}" />
            </p:column>
            <p:column headerText="Metadata Value">
                <h:outputText value="#{result.metadataValue}" />
            </p:column>
            <p:column headerText="WTX Adapter">
                <h:outputText value="#{result.wtxAdapter}" />
            </p:column>
            <p:column headerText="Card Number">
                <h:outputText value="#{result.cardNumber}" />
            </p:column>
            <p:column headerText="Create Date TS">
                <h:outputText value="#{result.createDateTS}" />
            </p:column>
        </p:dataTable>
        <br />
        <br />
        <br />
    </p:panel>

This is the relevant code from the bean:

public class UpdateMetadataItemsBean implements Serializable{
public static final long serialVersionUID = 4;
private String metadataKey;
private String mapName;
private String metadataName;
private String metadataValue;
private String wtxAdapter;
private String cardNumber;
private String createDateTS;
private String searchTerm;
private String selectedDataKey;
private boolean show = false;
private MetadataItems selectedMetadataItem;
private ArrayList<MetadataItems> results = new ArrayList<MetadataItems>();

[getters and setters]

public void search() {
    Search s = new Search();
    setResults(s.search(searchTerm));

    setShow(true);
}

Thanks in advance to anyone who can point me in the right direction.


Solution

  • Alter

    selection="updateMetadataItemsBean.selectedMetadataItem"

    to

    selection="#{updateMetadataItemsBean.selectedMetadataItem}".