I am building a JSF form which includes a primefaces p:autoComplete component. The following is an extract from my xhtml page, showing the relvant information about the autoComplete component.
<p:autoComplete
value="#{curAttribute.value}"
completeMethod="#{newBacking.lookupActivated}"
var="curEntry"
itemLabel="#{curEntry.classname}"
itemValue="#{curEntry.id}"
emptyMessage="Start typing..."/>
Please notice that curAttribute
is an instance of the CosmoAttribute
class, and that the CosmoAttribute.value
is a String (of course, CosmoAttribute
has all the getters and setters for its fields).
The method newBacking.lookupActivated()
returns a List<CosmoCard>
.
CosmoCard.classname
and CosmoCard.id
are both Strings.
I know that I'm woirking with POJOs, but since all my values are String fields from a POJO, I don't think that I need a converter. Anyway, my autoComplete field works fine, but when i select an item, i get the following exception:
SEVERE: Error Rendering View[/test.xhtml]
javax.el.PropertyNotFoundException: /test.xhtml @98,68 itemLabel="#{curEntry.id}": The class 'java.lang.String' does not have the property 'id'.
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at org.primefaces.component.autocomplete.AutoComplete.getItemLabel(AutoComplete.java:148)
.
.
Caused by: javax.el.PropertyNotFoundException: The class 'java.lang.String' does not have the property 'id'.
at javax.el.BeanELResolver.getBeanProperty(BeanELResolver.java:730)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:351)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
.
.
Has anyone a clue of what am I doing wrong? You can find a very similar question here, but it was unfortunately unanswered. I am willing to provide more details about my code.
UPDATE:
Actually, everything is working fine: I see the correct value in the dropdown of the p:autocomplete. As i select a value, the data in the backing bean (newBacking) is updated accordingly. I just can't get rid of the exception, which, however, does not have any effect on the execution of my page.
I am respecting the constraints of the tag, i.e. the value attribute and the itemValue are of the same type (both Strings). The only thing that is not properly ok is that the system tries to convert a List in a List, I don't know why, or when, but the failure in the conversion (and the subsequent exception) does not have any effect on the behaviour of my page.
UPDATE:
Here is the link to a very simplified version of the project (netbeans). The relevant files of the project are also listed below.
test.xhtml
<h:body>
<h:form id="form">
<p:dataTable var="curAttribute" value="#{newBacking.card.attributes}">
<p:column >
THE CURSED FIELD <br /><br />
<p:autoComplete
value="#{curAttribute.value}"
completeMethod="#{newBacking.lookupActivated}"
var="curEntry"
itemLabel="#{curEntry.code}"
itemValue="#{curEntry.id}">
</p:autoComplete>
</p:column>
</p:dataTable>
</h:form>
newBacking.java
@Named()
@SessionScoped
public class NewBacking implements Serializable {
private CosmoCard card;
private String currentCardClassname = "";
@PostConstruct
public void init() {
Random randomGenerator = new Random();
card = new CosmoCard();
card.setId("ID" + randomGenerator.nextInt(1000));
CosmoAttribute myLA = new CosmoAttribute();
myLA.setLabel("LookupAttributeLabel");
myLA.setValue("LookupAttributeValue");
card.getAttributes().add(myLA);
}
public CosmoCard getCard() {
return card;
}
public String getCurrentCardClassname() {
return currentCardClassname;
}
public void setCurrentCardClassname(String currentCardClassname) {
this.currentCardClassname = currentCardClassname;
}
public List<CosmoCard> lookupActivated(String tgtQuery) {
Logger.getLogger(NewBacking.class.getName()).info("[NewBacking.lookupActivated()] Query: " + tgtQuery);
return CosmoCardList.generateCardList(10).getCards();
}
}