JSF Composite组件:当属性(即valueChangeListener)不可用时发生错误

时间:2013-01-31 09:05:51

标签: jsf-2

我有这样的复合(X):

<composite:interface>
  <composite:attribute name="textValue" />
  <composite:attribute name="textValueChangeListner"
                       method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)" />

<composite:implementation>          
      <ice:inputText
                      value="#{cc.attrs.textValue}"
                      valueChangeListener="#{cc.attrs.textValueChangeListner}"/>

在JSF页面中,我有类似的内容:

<X:iText
textValue="#{cardBean.getCardValue}"
textValueChangeListner="#{cardHandler.cardValueChanged}" />  

上面的代码工作正常。但是当没有“textValueChangeListner”从JFace页面传递给复合时,它不起作用;即:

<X:iText
textValue="#{cardBean.getCardValue}" /> 

我得到的错误: [javax.enterprise.resource.webcontainer.jsf.lifecycle]无法使用EL表达式'#{cc.attrs.textValueChangeListner}'来解析使用页面的复合组件:javax.faces.FacesException:无法使用页面使用页面解析复合组件EL表达式'#{cc.attrs.textValueChangeListner}'

在我的场景中,页面开发人员可能会或可能不会向复合组件提供“textValueChangeListner”。 我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

这里有两个选项:第一个是简单方法,如果用户没有提供Value Change侦听器,只需渲染另一个输入文本而不使用valueChangeListener。

<ice:inputText
                  value="#{cc.attrs.textValue}"
                  valueChangeListener="#{cc.attrs.textValueChangeListener}"
                  rendered="#{!empty cc.attrs.textValueChangeListener}"/>

如果您需要在任何情况下都有valueChangeListener,那么为该属性应用默认值:

<composite:attribute name="textValueChangeListener"
                       method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)"
                     required="false"
                     default="#{cc.valueChangedListener}" />

为此,您需要将复合组件绑定到辅助bean。您需要通过其接口声明定义组件的支持bean类型,如下所示:

<composite:interface componentType="yourComponentBean">
<composite:attribute name="textValueChangeListener"
                       method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)"
                     required="false"
                     default="#{cc.valueChangedListener}" />
</composite:interface>

这是yourComponentBean,它实现了默认的ValueChangedListener。

@FacesComponent("yourComponentBean")
public class YourComponentCC extends UINamingContainer
{
    public void valueChangedListener(ValueChangeEvent ev)
    {
       ....
    }
}

Btw cc是EL中用于访问在组件中定义为componentType的辅助bean的快捷方式。因此cc.valueChangedListener会调用valueChangedListener类中定义的YourComponentCC方法。

答案 1 :(得分:2)

将属性重命名为valueChangeListener并使用targets属性

<composite:attribute name="valueChangeListner"
                     method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)" 
                     targets="text" />

其中text是目标输入组件的ID,

<ice:inputText id="text" ... />

并从中删除valueChangeListener