我正在使用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似乎会使错误消失,至少会调用正确的侦听器方法。我宁愿不使用这种方法,但也许这些信息很有用。
答案 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标记,可能会引起混淆。