Java JSF CompositeComponent:实现选择
您好,我想实现一个CC-similor,它实现一个选择属性。这类似于PrimefacesJava JSF CompositeComponent:实现选择,java,jsf-2,composite-component,Java,Jsf 2,Composite Component,您好,我想实现一个CC-similor,它实现一个选择属性。这类似于Primefaces 以下是组合中的相关定义: <composite:interface componentType="my.CcSelection"> <composite:attribute name="actionListener" required="true" method-signature="void listener(javax.faces.event.AjaxBehav
以下是组合中的相关定义:
<composite:interface componentType="my.CcSelection">
<composite:attribute name="actionListener" required="true"
method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)"/>
<composite:attribute name="selection"/>
</composite:interface>
<composite:implementation>
...
<ui:repeat var="item" value="#{cc.attrs.data}">
<p:commandLink actionListener="#{cc.actionListener(item)}"/>
</ui:repeat>
...
</composite:implementation>
如果我将CC与值表达式一起用于选择(例如selection=“#{testBean.user}”
,veSelection
为null
(并且在调试迭代中未打印选择),我会得到一个NPE。如果我传递一个字符串(例如selection=“test”
),则属性选择在调试迭代中可用,但(当然)我得到一个ClassCastException
:
java.lang.String cannot be cast to javax.el.ValueExpression
如何为我的组件提供actionListener和selection属性,并在第一步中设置所选值,然后调用actionListener?至于调试迭代,在
UIComponent#getAttributes()的keyset和entryset中看不到值表达式
。中也明确提到了这一点。换句话说,该映射只包含具有静态值的条目。只有在映射上显式调用get()
,并且基础属性是值表达式时,它才会实际调用它并返回计算值
要获取值表达式,请改用
至于方法表达式,如果您的组合从UICommand
扩展,那么这是最简单的,但在您的特定情况下,这是非常笨拙的。只需将侦听器方法的目标设置为命令链接,并使用
在bean中设置所需的属性。这样,就不需要支持组件
...
...
java.lang.String cannot be cast to javax.el.ValueExpression
ValueExpression selection = getValueExpression("selection");