Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF2自定义组件具有属性值don';t触发属性设置程序_Jsf_Jsf 2_Attributes_Custom Component - Fatal编程技术网

JSF2自定义组件具有属性值don';t触发属性设置程序

JSF2自定义组件具有属性值don';t触发属性设置程序,jsf,jsf-2,attributes,custom-component,Jsf,Jsf 2,Attributes,Custom Component,我已经在JSF2.0中构建了一个自定义组件 标签如下所示: <x:myTag id="1" name="AAA" /> 如果我使用 <x:myTag id="1" name="AAA" /> 对于encodeBegin方法中的name属性,我总是得到null。调试之后,我注意到,setName方法从未被调用。我认为可能是关于EL的某些东西把事情搞砸了(我仍然相信原因与此相关),但真正奇怪的是,id属性工作正常:setter被调用,并且当econding开始时,值与预期

我已经在JSF2.0中构建了一个自定义组件

标签如下所示:

<x:myTag id="1" name="AAA" />
如果我使用

<x:myTag id="1" name="AAA" />
对于
encodeBegin
方法中的
name
属性,我总是得到
null
。调试之后,我注意到,
setName
方法从未被调用。我认为可能是关于EL的某些东西把事情搞砸了(我仍然相信原因与此相关),但真正奇怪的是,
id
属性工作正常:setter被调用,并且当econding开始时,值与预期值一样

我必须提到,如果我从
encodeBegin
方法调用
getAttributes().get(“name”)
,我会得到正确的名称值,但我很好奇为什么它不能与getter和setter一起工作


您知道我的组件缺少什么吗?

这种行为是预期的,并且符合规范。作为值表达式的属性值由设置。也就是说,只有在实际使用它们时才应该对它们进行评估,通常是在视图渲染期间

id
(和
binding
)属性有特殊处理:它在设置之前在视图构建期间进行评估,因此将调用“常规”setter而不是
setValueExpression()
(或
绑定
)时,视图的呈现将崩溃属性的动态计算结果与视图生成期间的值不同(由于某些原因)

更好的方法是将getter/setter委托给本地属性,而不是委托给本地属性。
setValueExpression()
最终也会出现在
stateheloper
中(注意,它根本不调用setter;如果需要数据,只需调用getter即可),而
getAttributes()
也会解析
stateheloper
中的值

public String getName() {
   return (String) getStateHelper().eval("name");
}

public void setName(String name) {
    getStateHelper().put("name", name);
}

请注意,您可以安全地删除
getId()
setId()
方法,因为它们已经在扩展的
UIComponentBase
超类中定义了。

谢谢您的回答!我想问一下,我是否必须实现一些特殊的方法来区分组件中不同类型的属性值。(我知道UIComponentBase是自己处理的)如果是的话,有没有一个最佳实践可以做到这一点?!不,你一般也不应该关心它。要获取(已计算的)属性值,只需调用getter。
<x:myTag id="#{dummyBean.id}" name="#{dummyBean.name}" />
public String getName() {
   return (String) getStateHelper().eval("name");
}

public void setName(String name) {
    getStateHelper().put("name", name);
}