POJO支持使用omnifaces进行primefaces自动完成

gan*_*lee 2 java autocomplete primefaces jsf-2 omnifaces

我试图用primefaces自动完成组件在我的项目,以避免编写特定的转换器,每个列表对象,我尝试使用omn​​ifaces作为建议在这里这里的"BalusC",我试图复制同样的方法处理,但不能能够得到这项工作.如果我在这里遗漏了什么,请查看下面的代码片段和建议吗?

代码[f:selectOneMenu]的第一部分工作正常,没有任何问题

XHTML

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
<ui:composition template="WEB-INF/layout/layout.xhtml">
    <ui:define name="content">
        <h:form>
            <h:outputText id="selected_status"
                value="#{mybean.objLuStatus.strDescColVal}" />
            <!-- h:selectOneMenu Working fine -->
            <h:selectOneMenu id="iterator2" value="#{mybean.objLuStatus}"
                converter="omnifaces.SelectItemsConverter">
                <f:selectItem itemLabel="Choose item" noSelectionOption="true" />
                <f:selectItems value="#{mybean.lstStatus}" var="entity"
                    itemLabel="#{entity.strDescColVal}" itemValue="#{entity}" />
                <f:ajax render="selected_status" />
            </h:selectOneMenu>
            <!-- p:autoComplete is NOT Working -->
            <p:autoComplete id="iterator3" value="#{mybean.objLuStatus}"
                converter="omnifaces.ListConverter" dropdown="true" var="entity"
                itemLabel="#{entity.strDescColVal}"
                placeholder="----- Select One -----" itemValue="#{entity}"
                completeMethod="#{mybean.completeList}">
                <f:ajax render="selected_status" />
            </p:autoComplete>
            <h:commandButton value="Submit" action="#{mybean.post}" />
        </h:form>
    </ui:define>
</ui:composition>
</html>
Run Code Online (Sandbox Code Playgroud)

管理Bean

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import com.ntr.foundation.model.LuStatus;

@ManagedBean(name = "mybean")
@ViewScoped
public class MyManagedBean extends BaseManagedBean implements Serializable {

    List<LuStatus> lstStatus;
    LuStatus objLuStatus;

    @PostConstruct
    public void init() {
        lstStatus = new ArrayList<LuStatus>();
        lstStatus.add(new LuStatus("1", "Draft", "DraftLong"));
        lstStatus.add(new LuStatus("2", "Approved", "ApprovedLong"));
    }

    public List<LuStatus> getLstStatus() {
        return lstStatus;
    }

    public void setLstStatus(List<LuStatus> lstStatus) {
        this.lstStatus = lstStatus;
    }

    public void post() {
        System.out.println("returned value " + objLuStatus);
    }

    public LuStatus getObjLuStatus() {
        return objLuStatus;
    }

    public void setObjLuStatus(LuStatus objLuStatus) {
        this.objLuStatus = objLuStatus;
    }

    public List<LuStatus> completeList(String strQuery) {
        return lstStatus;
    }

}
Run Code Online (Sandbox Code Playgroud)

但是我得到了以下错误......

提前致谢..

Caused by: java.lang.NullPointerException
    at org.omnifaces.converter.ListConverter.getAsObject(ListConverter.java:39) [omnifaces-1.7.jar:1.7]
    at org.primefaces.component.autocomplete.AutoCompleteRenderer.getConvertedValue(AutoCompleteRenderer.java:600) [primefaces-4.0.jar:4.0]
    at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1046) [jsf-api-2.2.4.jar:2.2]
    at javax.faces.component.UIInput.validate(UIInput.java:976) [jsf-api-2.2.4.jar:2.2]
Run Code Online (Sandbox Code Playgroud)

gan*_*lee 5

抱歉,我忽略了一行ListConverter文档.我错过了将ListConverter与原始列表一起提供,如下所述.

<o:converter converterId="omnifaces.ListConverter" list="#{mybean.lstStatus}" />
Run Code Online (Sandbox Code Playgroud)

我通过添加上面的代码行来实现这一点.

最终的xhtml将如下所示..

    <p:autoComplete id="iterator3" value="#{mybean.objLuStatus}" forceSelection="true"
        dropdown="true" var="entity"
        itemLabel="#{entity.strDescColVal}"
        placeholder="----- Select One -----" itemValue="#{entity}"
        completeMethod="#{mybean.completeList}">
        <f:ajax render="selected_status" />
         <o:converter converterId="omnifaces.ListConverter" list="#{mybean.lstStatus}" />
    </p:autoComplete>
Run Code Online (Sandbox Code Playgroud)

感谢omnifaces团队提供这样一个有用的实用工具......