私は2つのjsfページを持っています。layout.xhtml と page.xhtml。レイアウトは次のようになります。
<ui:composition>
<h:panelGroup id="menu" layout="block">
<h:outputText value="#{menuBean}" />
<h:form>
<ui:repeat var="menuItem" value="#{menuBean.menuItems}">
<button:menuItem label="#{msgs[menuItem.label]}" action="#{menuBean.selectItem(menuItem.label)}" update="#{update}" />
</ui:repeat>
</h:form>
</h:panelGroup>
<ui:repeat var="menuItem" value="#{menuBean.menuItems}">
<h:panelGroup layout="block" rendered="#{menuBean.selectedItemLabel eq menuItem.label}">
<ui:include src="#{menuItem.page}" />
</h:panelGroup>
</ui:repeat>
そして、このようなページ:
<h:panelGroup binding="#{page}" layout="block">
<ui:decorate template="../template.xhtml">
<ui:param name="menuBean" value="#{pageBean}" />
<ui:param name="update" value=":#{page.clientId}" />
</ui:decorate>
</h:panelGroup>
初めてページをレンダリングするときはすべて問題ありません(menuItemsがレンダリングされるなど)。ボタンをクリックすると、 が表示されますTarget Unreachable, identifier 'menuBean' resolved to null
。
menuBean
が再度割り当てられない理由と、この種のことを達成する別の方法が存在する場合(一般的なレイアウトページを作成し、そこにオブジェクトを渡してページを生成する)、何が起こっているのか説明できますか? 私の豆はSpringによって管理されています。
アップデート:
問題は、次のような複合ボタンに何らかの形で関連していると思います。
<composite:interface name="menuItem">
<composite:attribute name="action" targets="button" />
<composite:attribute name="styleClass" />
<composite:attribute name="label" />
<composite:attribute name="update" />
<composite:attribute name="rendered" />
<composite:insertChildren />
</composite:interface>
<composite:implementation>
<h:commandButton id="button" value="#{cc.attrs.label}" style="width: 150px;" action="#{cc.attrs.action}"
rendered="#{empty cc.attrs.rendered ? true : cc.attrs.rendered}" styleClass="menu-item #{cc.attrs.styleClass}" type="button">
<f:ajax render="#{cc.attrs.update}" />
</h:commandButton>
</composite:implementation>
タグを標準の h:commandButton に置き換えると、すべてが完全に機能します。オブジェクトをテンプレートに渡し、テンプレートは渡されたオブジェクトをコンポジットに渡していますが、間違いなく何かが欠けています。