将bean作为facelet参数和后续复合组件传递会导致'identifier''''''解析为null'异常

时间:2015-09-25 14:20:45

标签: jsf jsf-2 facelets composite-component uiinclude

我有简单的复合组件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.E​​valuationException:   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

有什么建议吗?

0 个答案:

没有答案