PrimeFaces p:ajax无法解析bean

时间:2014-07-04 14:11:08

标签: jsf jsf-2 primefaces

我正在使用PrimeFaces 5编写一个应用程序,目前我正在编写一个包含几个AutoComplete元素的屏幕,并认为一个自动完成的值会影响第二个自动完成中可用的选项。

我试图让它工作的方式是,当它填充第一个自动完成时,会触发Ajax事件以使用值更新支持bean,以便在调用第二个自动完成时,它具有值从第一个自动完成准备开启。

这是页面:

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://xmlns.jcp.org/jsf/passthrough"
    xmlns:pf="http://primefaces.org/ui">

    <pf:panel id="header" header="Details" style="margin-bottom:20px">
        <h:panelGrid columns="3" style="margin-bottom:10px;border-style:solid;border-width:0.1em;width:100%" cellpadding="5">
            <pf:outputLabel id="input1Label" for="input1" value="Specify Input 1" />
            <pf:autoComplete id="input1" value="#{bean.input1}" completeMethod="#{bean.completeInput1}"
                        var="input1" itemLabel="#{input1}" itemValue="#{input1}" >
                <pf:ajax event="itemSelect" listener="#{bean.input1ItemSelect}"/>
            </pf:autoComplete>
            <pf:message id="input1Msg" for="input1"/>

            <pf:outputLabel id="input2Label" for="input2" value="Input 2?" />
            <pf:autoComplete id="input2" value="#{bean.input2}" completeMethod="#{bean.completeInput2}"
                        var="input2" itemLabel="#{input2}" itemValue="#{input2}" />
            <pf:message id="input2Msg" for="input2"/>
        </h:panelGrid>
    </pf:panel>

</ui:composition>

但是当在input1中选择了一个值时,我收到此错误:

无法访问,标识符'bean'解析为null:javax.el.PropertyNotFoundException:目标无法访问,标识符'bean'已解析为null

现在接下来要指出的是,这个组合包含在父组合中,“bean”以下列方式作为参数传递:

<c:forEach items="#{parentBean.blockNames}" var="blockName" varStatus="loop">

    <f:subview id="block_subview_#{loop.index}">
        <ui:include src="#{blockName}">
            <ui:param name="bean" value="#{parentBean.blockBeans[loop.index]}"/>
        </ui:include>
    </f:subview>
</c:forEach>

我能够建立的是,如果我将pf:ajax标记中的引用“bean”更改为命名bean,它就能够解析bean引用并尝试调用监听器方法。因此,似乎由于某种原因,pf:ajax标记无法处理“bean”引用,因为它不是实际bean的名称,而是从父项传入的bean参数的名称。但是所有其他标签完全能够在这里解析“bean”。

有没有办法解决这个问题?

编辑:

将pf:ajax更改为f:ajax似乎会使错误消失,至少会调用正确的侦听器方法。我宁愿不使用这种方法,但也许这些信息很有用。

3 个答案:

答案 0 :(得分:0)

您可以尝试将所包含网页的内容放在composite component中,然后使用composite component代替ui:include

我曾在几个复杂的JSF网站工作,composite component技术从未遇到任何问题,而ui:include总是在循环中创建某种问题。

答案 1 :(得分:0)

找出原因,结果是支持bean(或者具体地说,父页面的支持bean)正在使用@RequestScoped(或者更确切地说它是默认的,因为没有指定范围),所以可能不再存在用户调用ajax调用的时间。将其更改为@ViewScoped可以解决问题。

答案 2 :(得分:-1)

那么,

这可能是因为 c:forEach 标记而发生的。尝试使用 ui:repeat

c:forEach不是JSF标记,可能会引起混淆。