【问题标题】:Unable to find matching navigation case from composite component无法从复合组件中找到匹配的导航案例
【发布时间】:2014-07-09 15:31:06
【问题描述】:

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

<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'

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

【问题讨论】:

  • 这里我不确定,但我认为值得一试:尝试将action="#{cc.attrs.action}" 更改为action="#{bean[cc.attrs.action]}" 并添加您的属性:&lt;comp:attribute name="bean"/&gt;,然后调用您的组件:@ 987654329@

标签: java jsf navigation richfaces composite-component


【解决方案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 “方法签名”属性(如果存在)。不同的目标客户 id 可以在目标列表中用空格(不是制表符空格)分隔,但是,如果 此属性不与此标记和属性一起使用 使用方法签名,则只有“名称”属性的值是 有针对性或可以说'name'属性的唯一值是有针对性的。

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

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

【讨论】:

  • 不能在内部处理buttonId 吗?即,使用内部字符串,如操作 targets="actualButtonId" 然后 &lt;h:commandButton ... id="actualButtonId" /&gt; ;而不是在组合外部管理 ID?似乎更安全一些……还是我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2016-07-21
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
相关资源
最近更新 更多