无法从复合组件中找到匹配的导航案例

时间:2014-07-09 15:31:07

标签: java jsf navigation richfaces composite-component

我有一个复合组件按钮,操作来自一个属性。

<comp:interface>
    <comp:attribute name="buttonId" required="false"/>
    <comp:attribute name="action" required="false" method-signature="java.lang.String action()"/>
    <comp:attribute name="alt"/>
    <comp:attribute name="value" />
    <comp:attribute name="immediate"/>
</comp:interface>

<comp:implementation>
    <h:commandButton alt="#{cc.attrs.alt}" action="#{cc.attrs.action}"
                     value="#{cc.attrs.value}"  id="#{cc.attrs.buttonId}"
                     immediate="#{cc.attrs.immediate}"/>
</comp:implementation>

当我创建按钮时,操作来自我的控制器。

<test:myButton value="Test" alt="test" action="{myController.doSomething}" immediate="true" buttonId="testId"/> 

然后我有一个查找myController.doSomething

的导航规则
<navigation-case>
        <from-action>#{myController.doSomething}</from-action>
        <from-outcome>success</from-outcome>
        <to-view-id>/pages/test1.xhtml</to-view-id>
        <redirect />
 </navigation-case>

问题是,当我点击按钮时,操作来自#{cc.attrs.action},所以我收到以下错误

Unable to find matching navigation case with from-view-id '/pages/test.xhtml' for action '#{cc.attrs.action}' with outcome 'success'

我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

添加targets属性以将action属性重新定位到commandButton将解决该问题。然后在commandButton上不需要action属性。

<comp:interface>
    <comp:attribute name="buttonId"/>
    <comp:attribute name="action" targets="#{cc.attrs.buttonId}" method-signature="java.lang.String action()"/>
    <comp:attribute name="alt"/>
    <comp:attribute name="value" />
    <comp:attribute name="immediate"/>
</comp:interface>

<comp:implementation>
    <h:commandButton alt="#{cc.attrs.alt}" 
                     value="#{cc.attrs.value}"  id="#{cc.attrs.buttonId}"
                     immediate="#{cc.attrs.immediate}"/>
</comp:implementation>

http://www.devmanuals.com/tutorials/java/jsf/jsf2TagLibrary/composite/attribute.html

  

targets:这是指定目标的必需属性   通过调用组件客户端ID   &#39;方法签名&#39;属性(如果存在)。不同的目标客户   id可以用目标列表中的空格(不是制表符空格)分隔,但是如果   此属性不与此标记和属性一起使用   使用method-signature,然后只使用&#39; name&#39;的值。属性是   有针对性或可以说是&#39; name&#39;的唯一价值。属性是目标。

您还可以使用以下链接中targetAttributeName属性文档中描述的方法。基本上,您将cc:attribute的名称与commandButton id相同,然后使用targetAttributeName="action"表示您正在重新定位commandButton操作属性。

http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/composite/attribute.html