わかりやすく(簡潔にするために)私は自分のコードの重要な部分だけを列挙しています。なぜJSFはネストされたクラスをバッキングBeanで正しくインスタンス化できないのですか?
は、私は2つのネストされたクラスを含むバッキングBean MemberViewを持っている:インスタンス化されている
private Person person;
private Member member;
ページのロード時:適切なゲッターとセッターとの
@PostConstruct
public void init() {
person = new Person();
member = new Member();
}
。
<p:inputText value="#{memberView.person.lastName}" />
<p:inputText value="#{memberView.member.id}" />
とバッキングBeanの検索ルーチンを呼び出すコマンドボタン:
<p:commandButton value="Retrieve" type="submit"
actionListener="#{memberView.fetchMembers()}"
update="@all"/>
ページがロードのない私はPrimeFacesして表示ネストしたクラスのプロパティを利用したWebページ、member.xhtmlを、持っています入射。しかし、CommandButtonを選択するとEL ContextAwarePropertyNotFoundExceptionが発生します。javax.el.PropertyNotFoundException:Target Unreachable、 'member'がnullを返しました。何が起こっているかを追跡するために、
、私はGET-とsetMember方法にいくつかのログを追加しました:ここ
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;
}
は、私がCommandButton
上でクリックしたときに出力されます。
INFO: getMember() invoked
INFO: getMember() returning Member: [email protected] with ID: null
INFO: getMember() invoked
INFO: getMember() returning Member: [email protected] with ID: null
INFO: getMember() invoked
INFO: getMember() returning Member: [email protected] with ID: null
INFO: setMember() invoked with argument: null
INFO: getMember() invoked
WARNING: getMember() returning NULL
、メンバーは除外されています。もう一つの詳細。
:私は<!-- <p:inputText value="#{memberView.member.id}" /> -->
会員IDの入力フィールドをコメントアウトして、検索ボタンを選択した場合、ネストされたMemberView Personクラスによって提供されるよう、ページは、メンバーと名前フィールドの名前とのdataTableを移入します
<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}" />
インスタンス化されたクラスを正常に戻した3回の呼び出しの後に、null引数を指定してsetMemberメソッドへのEL呼び出しを説明するのが完全に忘れています。私はすべての提案に開放されています。
'
を非常に同じプロパティに設定しています。これは意図ですか?何も選択されていない場合、または選択された選択がデータテーブル内のレコードと一致しない場合、結果はそれ自体で表明されます。 – BalusC
これは、選択が行われず選択イベントが発生していなくても、dataTableによってmemberView.memberがnullに設定されることを意味しますか?私の選択リスナーは、そのようなすべてのイベントを記録します。私はdataTableの選択がclazzView.clazzに設定され、同じフォームのinputTextフィールドがclazzView.clazz.variableに設定され、これらはうまく動作する他の多くのWebページがあります。あなたの質問に答えるために、はい、これは意図的です。私はnullに設定されているクラス変数を理解できますが、クラス自体は理解できません。 –
はい、それはあなたが '空の/新規/初期化された'メンバオブジェクトを扱う方法をデータテーブルが知ることができないためです。ヌルであることがより明示的です。ゲッターは、jsfの提出サイクルのさまざまな段階で呼び出されます。http://balusc.omnifaces.org/2011/09/communication-in-jsf-20.htmlを参照してください。あなたは経験したことを回避することができますが、それは...まあ...回避策です。 BalusCのような同じプロパティを使用しない方が良い – Kukeltje