我在 JSF 2.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" />
一切都按预期工作,但是当我将 EL 用于 myTag 属性时,该setName()
方法永远不会被调用。因此对于,
<x:myTag id="#{dummyBean.id}" name="#{dummyBean.name}" />
我总是在我的方法中null
获取name
属性。encodeBegin
调试后,我注意到该setName
方法永远不会被调用。我认为可能关于 EL 的某些事情会搞砸(我仍然相信原因与此有关),但真正奇怪的是该id
属性运行良好:setter 被调用,并且在 econding 开始时值与预期一致.
我不得不提一下,如果我getAttributes().get("name")
从encodeBegin
方法调用我会得到正确的名称值,但我很好奇为什么它不适用于 getter 和 setter。
任何想法我的组件缺少什么?