我有简单的复合组件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
}
}
当我按下顶部按钮时,它工作正常。在控制台中我看到:
参数:simpleButton
当我按下底部按钮(我的场景)时,它会引发异常:
javax.el.PropertyNotFoundException:JBWEB006016:目标不可达,标识符“actionBeanParam”解析为空:javax.faces.el.EvaluationException:javax.el.PropertyNotFoundException:JBWEB006016:目标不可达,标识符“actionBeanParam”解析为空
我在这里发现了类似的问题:Managed Bean as Facelet parameter让复合组件阻止解析
但是我不能使用这个问题的解决方法,因为我的操作有一个参数。
c:set
我有一个解决方法来通过in重置参数details.xhtml
:
<c:set var="actionBeanParam" scope="view" value="#{actionBeanParam}" />
但是当details.xhtml
包含不止一次时它会不正确。
我使用的是:JBoss EAP 6.2.1、Mojarra 2.1.19-jbossorg-1
有什么建议么?