Невозможно найти соответствующий случай навигации из составного компонента

1

У меня есть составная кнопка компонента, и действие происходит от атрибута.

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

Как я могу обойти это?

  • 0
    Я не уверен, что здесь, но я думаю, что стоит попробовать: попробуйте изменить action="#{cc.attrs.action}" на action="#{bean[cc.attrs.action]}" и добавить свои атрибуты : <comp:attribute name="bean"/> и при вызове вашего компонента: <test:myButton value="Test" alt="test" action="doSomething" bean="myController" immediate="true" buttonId="testId"/>
Теги:
navigation
jsf
richfaces
composite-component

1 ответ

1
Лучший ответ

Добавление атрибута target для перенаправления атрибута действия в commandButton решит проблему. Атрибут action тогда не нужен в commandButton.

<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

Цели: Это обязательный атрибут, который указывает цель для вызова идентификаторов клиента компонента с помощью атрибута "метод-подпись" (если имеется). Различные идентификаторы целевых клиентов могут быть разделены пробелом (не табуляционным пространством) в целевом списке, но если этот атрибут не используется с этим тегом и используется метод-подпись атрибута, то используется только значение атрибута "name" или может скажем, единственное значение атрибута 'name' является целевым.

Вы также можете использовать метод, описанный в документации атрибута targetAttributeName, по ссылке ниже. В основном вы должны иметь имя cc:attribute те же, что и идентификатор commandButton, а затем использовать targetAttributeName="action" чтобы сказать, что вы перенаправляете для атрибута action commandButton.

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

  • 0
    Не может ли buttonId обрабатываться внутри? то есть, используя внутреннюю строку, например action targets="actualButtonId" а затем <h:commandButton ... id="actualButtonId" /> ; вместо управления идентификаторами извне в композит? Это кажется немного более безопасным ... Или я что-то упустил?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню