For the sake of clarity (and brevity) I am listing just the key segments of my code.
I have a backing bean MemberView containing two nested classes:
private Person person;
private Member member;
that are instantiated when the page loads:
@PostConstruct
public void init() {
person = new Person();
member = new Member();
}
with the appropriate getters and setters. I have a web page, member.xhtml, that utilizes PrimeFaces and displays nested class properties:
<p:inputText value="#{memberView.person.lastName}" />
<p:inputText value="#{memberView.member.id}" />
and a CommandButton that calls a search routine in the backing bean:
<p:commandButton value="Retrieve" type="submit"
actionListener="#{memberView.fetchMembers()}"
update="@all"/>
The page loads without incident. But selecting the CommandButton results in an EL ContextAwarePropertyNotFoundException: javax.el.PropertyNotFoundException: Target Unreachable, 'member' returned null.
To track what is happening, I added some logging to the get- and setMember methods:
public Member getMember() {
LOG.info("getMember() invoked");
if(member == null) {
LOG.log(Level.WARNING, "getMember() returning NULL");
}
LOG.info("getMember() returning Member: " + member.toString()
+ " with ID: " + member.getId());
return member;
}
public void setMember(Member member) {
LOG.info("setMember() invoked with argument: " + member);
this.member = member;
}
Here is the output when I click on the CommandButton
:
INFO: getMember() invoked
INFO: getMember() returning Member: scc.model.Member@6f453701 with ID: null
INFO: getMember() invoked
INFO: getMember() returning Member: scc.model.Member@6f453701 with ID: null
INFO: getMember() invoked
INFO: getMember() returning Member: scc.model.Member@6f453701 with ID: null
INFO: setMember() invoked with argument: null
INFO: getMember() invoked
WARNING: getMember() returning NULL
Clearly, the class Member is being nulled out. One further detail. If I comment out the member ID input field
<!-- <p:inputText value="#{memberView.member.id}" /> -->
and then select the Retrieve button, the page populates a dataTable with the names of members and the name field, as supplied by the nested MemberView Person class:
<p:dataTable id="dtPerson" var="member"
style="margin-top:10px;text-align:center;width:400px;minWidth:400px"
value="#{memberView.selectableMemberList}"
selectionMode="single" editable="false"
selection="#{memberView.member}" >
<p:inputText value="#{memberView.person.lastName}" />
I am at a complete loss to explain the EL call to the setMember method with a null argument after three calls that successfully returned the instantiated class. I am open to any and all suggestions.