У меня есть составная кнопка компонента, и действие происходит от атрибута.
<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'
Как я могу обойти это?
Добавление атрибута 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
buttonId
обрабатываться внутри? то есть, используя внутреннюю строку, например action targets="actualButtonId"
а затем <h:commandButton ... id="actualButtonId" />
; вместо управления идентификаторами извне в композит? Это кажется немного более безопасным ... Или я что-то упустил?
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"/>