Jsf 2 将参数传递给p:autoComplete的completeMethod

Jsf 2 将参数传递给p:autoComplete的completeMethod,jsf-2,autocomplete,primefaces,Jsf 2,Autocomplete,Primefaces,我正在项目的搜索表单中使用PrimeFacesp:autoComplete小部件。用户可以选择要包含多少以及哪些表单元素(搜索参数),因此我需要为每个元素向completeMethod传递一个ID。我尝试添加onfocus=“…”以将对象传递给bean,但只有在第一次加载元素时才会激活 我的问题:如何将属性传递给completeMethod 元素的XHTML(简单): bean(简单): @Named(“myBean”) 公共类MyController实现可序列化{ 公共列表完成(字符串查询

我正在项目的搜索表单中使用PrimeFaces
p:autoComplete
小部件。用户可以选择要包含多少以及哪些表单元素(搜索参数),因此我需要为每个元素向
completeMethod
传递一个ID。我尝试添加
onfocus=“…”
以将对象传递给bean,但只有在第一次加载元素时才会激活

我的问题:如何将属性传递给
completeMethod

元素的XHTML(简单):


bean(简单):

@Named(“myBean”)
公共类MyController实现可序列化{
公共列表完成(字符串查询){
列表结果=新建ArrayList();
//…代码
返回结果;
}
}
理论上,这似乎是一个完美的解决方案:

<p:autoComplete value="#{filter.value}" label="dynamic search attribute"
                completeMethod="#{myBean.complete(filter)}" />

还有豆子:

@Named("myBean")
public class MyController implements Serializable {

    public List<String> complete(String query, FilterObject o) {
        List<String> results = new ArrayList<String>();
        // ... database query based on FilterObject o
        return results;
    }
}
@Named(“myBean”)
公共类MyController实现可序列化{
公共列表完成(字符串查询、筛选器对象o){
列表结果=新建ArrayList();
//…基于FilterObject o的数据库查询
返回结果;
}
}

您可以将其设置为属性:

<p:autoComplete value="#{filter.value}" label="dynamic search attribute" completeMethod="#{myBean.complete}">
    <f:attribute name="filter" value="#{filter}" />
</p:autoComplete>
或者,由于您的案例中出现的
{filter}
已经在EL范围内,您也可以将
放在一边,通过以下帮助以编程方式计算EL表达式来获得它:


我尝试了两种建议的解决方案,它们都很有效。我选择了第二种方法,因此不需要属性。谢谢!不客气。请注意,我添加了一个
@Inject
建议,这可能也适用于您。
@Named("myBean")
public class MyController implements Serializable {

    public List<String> complete(String query, FilterObject o) {
        List<String> results = new ArrayList<String>();
        // ... database query based on FilterObject o
        return results;
    }
}
<p:autoComplete value="#{filter.value}" label="dynamic search attribute" completeMethod="#{myBean.complete}">
    <f:attribute name="filter" value="#{filter}" />
</p:autoComplete>
public List<String> complete(String query) {
    FacesContext context = FacesContext.getCurrentInstance();
    FilterObject o = (FilterObject) UIComponent.getCurrentComponent(context).getAttributes().get("filter");
    // ...
}
public List<String> complete(String query) {
    FacesContext context = FacesContext.getCurrentInstance();
    FilterObject o = context.getApplication().evaluateExpressionGet(context, "#{filter}", FilterObject.class);
    // ...
}
@Inject
private FilterObject o;