Передача метода в составной компонент выполняет метод напрямую
Я пытаюсь создать стандартизированную панель кнопок, которая будет отображаться на большинстве наших экранов. Поскольку кнопки всегда будут одинаковыми, за исключением некоторых действий, подпись составного компонента такова:
<composite:interface>
<composite:attribute required="true" name="fallbackOutcomeOnClose" type="java.lang.String"/>
<composite:attribute name="saveAction" method-signature="void action()"/>
<composite:attribute name="resetAction" method-signature="void action()"/>
<composite:attribute default="@form" name="processOnSave" type="java.lang.String"/>
</composite:interface>
<composite:implementation>
<partials:navigationButton title="#{msg['common.close']}" fallbackOutcome="#{cc.attrs.fallbackOutcomeOnClose}"/>
<c:if test="#{null ne cc.attrs.saveAction}">
<p:commandButton title="#{msg['common.save']}" value="#{msg['common.save']}"
action="#{cc.attrs.saveAction}"
styleClass="btn btn-primary pull-right"
process="@this #{cc.attrs.processOnSave}"
update="@all"/>
</c:if>
<c:if test="#{null ne cc.attrs.resetAction}">
<partials:warningWithConfimButton title="msg['common.reset']" action="#{cc.attrs.resetAction}" type="reset" styleClass="pull-right"/>
</c:if>
Когда я добавляю этот CC на мой взгляд, вот так:
<partials:standardButtonPanel fallbackOutcomeOnClose="someview" resetAction="#{zef0302View.reset()}"
saveAction="#{zef0302View.save()}" processOnSave="zef0302_allg_det_id zef0302_periodika_id zef0302_indexierung_id"/>
Метод zef0302View.save()
вызывается напрямую и не передается в ЦК. Что я делаю неправильно? Я уже передал методы в качестве атрибутов другим компонентам, но не вижу, что я сделал по-другому.
Я использую Wildfly 8.1 с JSF 2.2.
Спасибо за помощь.
[Редактировать]
Проблема заключалась не в передаче атрибутов, а в проверке их наличия в ЦК. Видимо при тестировании такого метода <c:if test="null ne cc.attrs.resetAction"/>
этот метод вызывается. То же самое верно для тестирования not empty cc.attrs.resetAction
,
Чтобы правильно проверить наличие атрибута метода, не вызывая его <c:if test="cc.getValueExpression('actionMethod')">
(или положить его в rendered
блок везде где нужно).
Решение пришло из другого вопроса, на который Smutje был так любезен, чтобы обратить мое внимание (см. Комментарии).