我们正在从jsf 1.2升级到jsf 2。 我们正在使用apache myfaces 2.1和富面4.3。
以下是迁移前的xhtml代码:
<h:inputText id="#{userSearch}" value="#{bean.input}"/>
<rich:suggestionbox for="#{userSearch}" var="rslt" suggestionAction="#{bean.getSearchList}">
</rich:suggestionbox>
根据迁移文档,将<rich:suggestionbox>
替换为<rich:autocomplete>.
以下是xhtml代码:
<rich:autocomplete mode="ajax" autocompleteMethod="#{bean.getSearchList}" />
下面是getSearchList方法
public List<CustomObject> getSearchList(String searchNow) {
}
<rich:autocomplete>
组件存在于自定义组件中,该组件的调用方式如下:
<example:SearchUsr bean="#{someOtherObject.bean}"/>
我面临的问题是,当在<rich:autocomplete>
内输入输入时,会发生ajax调用,但我正处于异常之下:
目标无法访问,标识符'bean'已解析为null。
我在xhtml中打印了bean(bean.getSearchList)的值,它不是null。
使用<rich:autocomplete>
时我错过了什么?请帮忙。
编辑1:
当像这样调用autocompleteMethod:#{masterBean.object2.object3.getSearchList}
时,没有观察到这个问题,其中masterBean是faces-config.xml中定义的具有会话范围的masterBean。 autocompleteMethod也必须接受String参数而不是对象。
那么我们不能在中间对象上调用autocompleteMethod吗?它必须是JSF中定义的bean吗?这很奇怪,但我观察到同样的行为。
编辑2: 在尝试搜索答案时,获得了指出同一问题的链接:autocomplete method does not resolve bean if ui:included and only one parameter provided 它提供了两个选项:使用3个参数定义自动完成方法,使用复合组件,而不是ui:inlcude。
答案 0 :(得分:2)
从EDIT 2可以看出,自动完成方法签名更改为:
public List<CustomObject> getSearchList(FacesContext context, UIComponent uiComp,String searchNow)
,问题已解决。