JSF2.0でカスタムコンポーネントをビルドしました
タグは次のようになります。
<x:myTag id="1" name="AAA" />
対応するJavaクラス:
@FacesComponent("a.b.c.MyTag")
public class UIMyTag extends UIInput {
private String name;
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
ResponseWriter writer = context.getResponseWriter();
logger.debug(getName()); //prints null for name="#{dummyBean.name}"
// and AAA for name="AAA"
logger.debug(getAttributes().get("name")); // always correct value
...
}
....
}
使用する場合
<x:myTag id="1" name="AAA" />
すべてが期待どおりに機能しますが、myTag属性にELを使用すると、setName()
メソッドが呼び出されることはありません。だから、
<x:myTag id="#{dummyBean.id}" name="#{dummyBean.name}" />
私は常にメソッド内のプロパティを取得null
します。デバッグした後、メソッドが呼び出されないことに気付きました。ELに関する何かが混乱しているのではないかと思いましたが(その理由はまだそれに関連していると思います)、本当に奇妙なのは、プロパティがうまく機能していることです。セッターが呼び出され、エコニングが始まると値は期待どおりです。 。name
encodeBegin
setName
id
getAttributes().get("name")
メソッドから呼び出すと正しい名前の値が得られることに言及する必要がencodeBegin
ありますが、なぜそれがgetterとsetterで機能しないのか興味があります。
私のコンポーネントに欠けているアイデアはありますか?