h:selectOneMenu无法将'5'转换为'null converter'。转换错误

时间:2014-02-03 16:21:18

标签: jsf-2 converter selectonemenu

我正在尝试使用h:selectOneMenu,但它不会将值发送到backbean。我尝试发送一个简单的值,一个完整的bean。

以下是代码:

<h:selectOneMenu value="#{campanha.campanha}" onchange="submit();">
  <f:selectItems value="#{campanha.campanhas}" var="c" itemLabel="#{c.nome}" itemValue="# c.codigo}"  />
</h:selectOneMenu>

`

豆:

@ManagedBean(name = "campanha")
@RequestScoped
public class CCampanha {

private List<Campanha> campanhas;
private Campanha campanha;

public void inicializar(ComponentSystemEvent event) {
    campanhas = new ArrayList<Campanha>();
    campanhas.add(new Campanha(1, "campanha 1"));
    campanhas.add(new Campanha(2, "campanha 2"));
    campanhas.add(new Campanha(3, "campanha 3"));
    campanhas.add(new Campanha(4, "campanha 4"));
    campanhas.add(new Campanha(5, "campanha 5"));
    campanhas.add(new Campanha(6, "campanha 6"));
    campanhas.add(new Campanha(7, "campanha 7"));

}

public String selecionarCampanha() {
    System.out.println(campanha.getCodigo());

    return "busca.jsf?faces-redirect=true";
}

public List<Campanha> getCampanhas() {
    return campanhas;
}

public void setCampanhas(List<Campanha> campanhas) {
    this.campanhas = campanhas;
}

public Campanha getCampanha() {
    return campanha;
}

public void setCampanha(Campanha campanha) {
    this.campanha = campanha;
}

}

提交表单后,控制台会显示此消息:

03/02/2014 14:37:12 com.sun.faces.renderkit.RenderKitUtils renderUnhandledMessages
INFO: AVISO: FacesMessage(s) foram enfileirados, mas podem não ter sido exibidos.
sourceId=j_idt12:j_idt16[severity=(ERROR 2), summary=(Erro de conversão ao definir o     valor '5' para 'null Converter'. ), detail=(Erro de conversão ao definir o valor '5' para 'null Converter'. )]

它意味着:无法将'5'转换为'null converter'。转换错误。

我正在使用Java,jsf2.2和tomcat 6。

2 个答案:

答案 0 :(得分:1)

在你的情况下尝试这个,更改在这里,默认情况下jsf支持Integer(和更多see this)转换器,你提交一个对象value="#{campanha.campanha}"所以你需要创建custom convertor

@ManagedBean(name="campanha")
//someScoped     
public class Campanha {

}



    <h:selectOneMenu value="#{cCampanha.campanha.codigo}" onchange="submit();">
          <f:selectItems value="#{cCampanha.campanhas}" var="c" itemLabel="#{c.nome}" itemValue="# c.codigo}"  />
        </h:selectOneMenu>




        @RequestScoped
        public class CCampanha {

        private List<Campanha> campanhas;

        @ManagedProperty(value = "#{campanha}")
        private Campanha campanha;

        public void inicializar(ComponentSystemEvent event) {
            campanhas = new ArrayList<Campanha>();
            campanhas.add(new Campanha(1, "campanha 1"));
            campanhas.add(new Campanha(2, "campanha 2"));
            campanhas.add(new Campanha(3, "campanha 3"));
            campanhas.add(new Campanha(4, "campanha 4"));
            campanhas.add(new Campanha(5, "campanha 5"));
            campanhas.add(new Campanha(6, "campanha 6"));
            campanhas.add(new Campanha(7, "campanha 7"));

        }

        public String selecionarCampanha() {
            System.out.println(campanha.getCodigo());

            return "busca.jsf?faces-redirect=true";
        }

        public List<Campanha> getCampanhas() {
            return campanhas;
        }

        public void setCampanhas(List<Campanha> campanhas) {
            this.campanhas = campanhas;
        }

        public Campanha getCampanha() {
            return campanha;
        }

        public void setCampanha(Campanha campanha) {
            this.campanha = campanha;
        }
        }

by @ManagedProperty我们将托管bean注入另一个托管bean的属性,例如mkyong

答案 1 :(得分:0)

您可以尝试在:

中使用相同的var类型

h:selectOneMenu - &gt;值

并在

f:selectItems&gt;项目值

您正在使用对象 h:selectOneMenu - &gt; value="#{campanha.campanha}"

和一个原始的类型 f:selectItems&gt; itemValue="# c.codigo}"

只需替换它:

<h:selectOneMenu value="#{campanha.campanha}" onchange="submit();">

这一个:

<h:selectOneMenu value="#{campanha.campanha.codigo}" onchange="submit();">

当然,如果campanha.campanha永远不为null,则此解决方案有效,否则会出错

或者您可以尝试在CCampanha中声明一个整数变量,并将此变量设置为 h:selectOneMenu - &gt;值