ほとんどの画面に表示される標準化されたボタンパネルを作成しようとしています。一部のアクションを除いて、ボタンは常に同じであるため、複合コンポーネントのシグネチャは次のとおりです。
<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()
は直接呼び出され、CC には渡されません。私は何を間違っていますか?すでにメソッドを属性として他のコンポーネントに渡していますが、何が違うのかわかりません。
JSF 2.2 で Wildfly 8.1 を使用しています。
助けてくれてありがとう。
[編集]
問題は属性の受け渡しではなく、CC 内のそれらの存在のテストでした。どうやらこのようなメソッドをテストすると、<c:if test="null ne cc.attrs.resetAction"/>
そのメソッドが呼び出されます。同じことがテストにも当てはまりますnot empty cc.attrs.resetAction
。
メソッド属性の存在を適切にテストするには、実際にメソッド属性を呼び出す<c:if test="cc.getValueExpression('actionMethod')">
(または必要に応じてrendered
ブロックに配置する) 必要はありません。
解決策は、Smutje が親切にも私の注意を向けてくれた別の質問から得られました (コメントを参照)。