我有简单的复合组件button.xhtml
:
<composite:interface>
<composite:attribute name="action" method-signature="void listener(java.lang.String)"/>
</composite:interface>
<composite:implementation>
<h:form>
<h:commandButton value="button" action="#{cc.attrs.action}"/>
</h:form>
</composite:implementation>
它在details.xhtml
页面上使用:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:comp="http://java.sun.com/jsf/composite/comp">
<comp:button action="#{actionBeanParam.doAction('someParam')}"/>
</ui:composition>
details.xhtml
页面包含在另一个页面中。注意actionBeanParam
。它作为参数传递给details.xhtml
。页面显示两个按钮(用于测试目的) - 第一个按钮用于检查复合组件是否有效。第二个按钮是我想要实现的:
<h:body>
<comp:button action="#{actionBean.doAction('simpleButton')}"/>
<ui:include src="/WEB-INF/blocks/details.xhtml">
<ui:param name="actionBeanParam" value="#{actionBean}"/>
</ui:include>
</h:body>
最后支持bean:
@Named
@SessionScoped
public class ActionBean implements Serializable {
public void doAction(String param) {
System.out.println("Param: " + param);
// some action
}
}
按下顶部按钮时效果很好。在控制台中我看到:
Param:simpleButton
当我按下底部按钮(我的场景)时,它会抛出异常:
javax.el.PropertyNotFoundException:JBWEB006016:目标无法访问, 标识符''actionBeanParam''解析为null: javax.faces.el.EvaluationException: javax.el.PropertyNotFoundException:JBWEB006016:目标无法访问, 标识符''actionBeanParam''已解析为null
我在这里发现了类似的问题:Managed Bean as Facelet parameter lets composite component prevent resolving
但我无法使用此问题的解决方法,因为我的操作有参数。
我有一个解决方法,可以通过c:set
中的details.xhtml
重新设置参数:
<c:set var="actionBeanParam" scope="view" value="#{actionBeanParam}" />
但如果多次包含details.xhtml
,则效果不正确。
我在使用什么:JBoss EAP 6.2.1,Mojarra 2.1.19-jbossorg-1
有什么建议吗?