'omnifaces.SelectItemsConverter'转换器ID未注册

时间:2013-11-15 17:19:10

标签: jsf jsf-2 primefaces omnifaces

我正在尝试在我的应用程序中创建一个selectManyCheckbox功能,但现在我处于“转换器问题”。要注意这一点,我正在尝试使用已经有对象转换器的Omnifaces。

我的解决方案基于on thisthis question(均由BalusC回答)。


不知道是否有帮助,但他是我的查看代码:

<h:selectManyCheckbox style="margin-bottom: 40px;" id="disciplinas" value="#{cursoMBean.listaDisciplinasDoCurso}" converter="omnifaces.SelectItemsConverter">
    <f:selectItems value="#{cursoMBean.listaTodasDisciplinas}" var="disciplina" itemValue="#{disciplina}" itemLabel="#{disciplina.nome}"/>
</h:selectManyCheckbox>

我的MBean:

private static ArrayList<Disciplina> listaTodasDisciplinas;
private static ArrayList<Disciplina> listaDisciplinasDoCurso;

public ArrayList<Disciplina> getListaTodasDisciplinas() {
    return listaTodasDisciplinas;
}

public void setListaTodasDisciplinas(
        ArrayList<Disciplina> listaTodasDisciplinas) {
    CursoMBean.listaTodasDisciplinas = listaTodasDisciplinas;
}

public ArrayList<Disciplina> getListaDisciplinasDoCurso() {
    return listaDisciplinasDoCurso;
}

public void setListaDisciplinasDoCurso(
        ArrayList<Disciplina> listaDisciplinasDoCurso) {
    CursoMBean.listaDisciplinasDoCurso = listaDisciplinasDoCurso;
}

Disciplina:

public class Disciplina {

    private int id;
    private String nome;

    public Disciplina(int id, String nome) {
        this.id = id;
        this.nome = nome;
    }

    public Disciplina() {
    }

    // Methods
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        if (!(nome.isEmpty() || nome == " " || nome == "  ")){
            this.nome = nome;
        }
    }

    @Override
    public String toString() {
        return nome;
    }

}

我的问题是:这实际上不起作用。当我选择一些复选框并提交时,这会创建一个新的Curso,但选定的Disciplina的arraylist仍然是空的。我认为问题是JSF无法找到Omnifaces转换器。这是我在视图中的HTML标记:

<html xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions">

当我将“转换器”悬停在selectManyCheckbox时出现警告:

'omnifaces.SelectItemsConverter' converter id is not registered.

我把Omnifaces JAR放在Web-Inf / lib中。对我来说,一切都很好,为什么Omnifaces不会用我选择的项目填充我的ArrayList?

修改

这是使用复选框提交表单的按钮:

<h:commandButton id="enviar" styleClass="btn btn-lg btn-success pull-right" value="Adicionar" action="#{cursoMBean.cadastrar}">
    <f:ajax event="click" onevent="insert.hide()" render=":meuForm:minhaTabela"
    listener="#{cursoMBean.cadastrar}" />
</h:commandButton>

这是被调用的方法:

public String cadastrar() {

    Curso curso = new Curso();
    System.out.println("Check if listaDisciplinasDoCurso have something inside): " + listaDisciplinasDoCurso.size() +"\n");
    for (Disciplina d : listaDisciplinasDoCurso) {
        System.out.println(d);
    }


    if (!(this.getNome().isEmpty() || this.getNome() == " " || this
            .getNome() == "  ")) {

        curso.setNome(this.getNome());

        // Clearing the listaDisciplinasDoCurso 
        listaDisciplinasDoCurso = new ArrayList<Disciplina>();

        // Adding course to database
        controleCurso.adicionar(curso);

        System.out.println("Inserted. " + curso.toString());
    } else {
        System.out.println("Error: Not inserted. " + curso.toString());
    }

    limparCampos();
    atualizarListagem();

    return null;
}

编辑2

我的最新代码,有两种形式:

<h:form id="inserirDisciplina">
    <div class="form-group">
        <div class="col-md-10">
            <h:inputText styleClass="form-control" id="disciplina" value="#{cursoMBean.nome}" valueChangeListener="#{cursoMBean.atualizarListagemPesquisa}">
                <f:ajax event="keyup" render=":meuForm:minhaTabela" />
            </h:inputText>
        </div>
        <div class="col-md-2">
            <h:commandButton value="Adicionar" styleClass="btn btn-md btn-success" process="disciplina" partialSubmit="true">
                <p:ajax event="click" update=":meuForm:display" render=":meuForm:dialog" partialSubmit="true" process="disciplina" oncomplete="PF('insert').show();" onerror="alert('erro');" />
            </h:commandButton>
        </div>
    </div>
</h:form>

<p:messages autoUpdate="true" />

<p:dialog id="dialog" header="Inserir Curso" widgetVar="insert"
                resizable="false" modal="true" width="600" height="500"
                hideEffect="clip" closeOnEscape="true">

<h:form>
    <h:panelGrid id="display" styleClass="col-lg-10 center" style="margin-top: 10px; margin-bottom: 15px;">
        <label for="nome">Nome:</label>
        <p:inputText styleClass="form-control adicionar" id="nome" value="#{cursoMBean.nome}">

        </p:inputText>
    </h:panelGrid>

    <h:panelGrid styleClass="col-lg-10 center">
        <p:columnGroup>
            <label for="disciplinas">Disciplinas do Curso:</label>
            <h:selectManyCheckbox style="margin-bottom: 40px;" id="disciplinas" value="#{cursoMBean.listaDisciplinasDoCurso}" converter="omnifaces.SelectItemsConverter">
                <f:selectItems value="#{cursoMBean.listaTodasDisciplinas}" var="disciplina" itemValue="#{disciplina}" itemLabel="#{disciplina.nome}" />
            </h:selectManyCheckbox>
        </p:columnGroup>
    </h:panelGrid>

    <h:panelGrid styleClass="col-lg-10 center">
        <p:columnGroup>
            <h:commandButton id="enviar" styleClass="btn btn-lg btn-success pull-right" value="Adicionar" action="#{cursoMBean.cadastrar}">
                    <f:ajax event="click" execute="@form" onevent="insert.hide()" render=":meuForm:minhaTabela" listener="#{cursoMBean.cadastrar}" />
            </h:commandButton>
        </p:columnGroup>
    </h:panelGrid>
</h:form>
</p:dialog>

1 个答案:

答案 0 :(得分:2)

关于标题中提到的Eclipse警告,

  

'omnifaces.SelectItemsConverter'转换器ID未注册

忽略它。它是actually通过@FacesConverter注释注册的。只有IDE不够聪明才能检测@FacesConverter中部署的JAR中的/WEB-INF/lib注释类。它只在<converter>中查找faces-config.xml个条目。尝试实际运行webapp项目。如果转换器未正确注册,那么您应该得到以下异常:

  

javax.faces.FacesException:Expression Error:对象名为:omnifaces.SelectItemsConverter not found


回到你的具体问题,那些static属性是不对的。删除那些static修饰符。此外,<f:ajax>默认执行当前组件,如

<f:ajax execute="@this">

如果您打算执行整个表单,则需要将其指定为@form

<f:ajax execute="@form">

此外,onevent="insert.hide()"是错误的。 onevent属性应指向函数引用,而不是执行函数调用。每个ajax请求依次调用函数引用三次。只需使用<h:commandButton onclick>即可。


对具体问题

无关,也摆脱event="click"已经是默认值。没有必要重复默认值。