Java JSF CompositeComponent:实现选择

Java 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

您好,我想实现一个CC-similor,它实现一个选择属性。这类似于Primefaces

以下是组合中的相关定义:

<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");