选择一个菜单未将所选值设置为后端

时间:2014-09-26 14:01:57

标签: java jsf primefaces

大家好我在尝试从selectOneMenu组件中选择一个值时遇到了问题。我正在使用primefaces 5和jsf 2

我有一个要在selectOneMenu中显示的对象列表,当选择一个对象时,后端变量(具有相同类型的对象)应该警告该值。但是,当我更改selectOneMenu中的值时,没有任何反应意味着不会调用变量的setter方法。

这是我的selectOneMenu代码

<p:selectOneMenu id="selectRepositorio"
    value="#{cadastroDocumentoControler.repositorio}">
    <f:selectItems 
        value="#{cadastroDocumentoControler.items}"  />

     <p:ajax update="tree" event="change" /> 
</p:selectOneMenu>

这是用于填充列表项的get方法,并且效果很好,我可以看到所有元素 selectOneMenu用于

public List<SelectItem> getItems(){
            listarRepositorios();

     items.add(0, new SelectItem("", "choose one..."));


       for(IRepositorio repositorio: repositorioList){     
           SelectItem si = new SelectItem(repositorio,repositorio.getNome());             
           items.add(si);
       }
       return items;

}

我的repositorio变量,该变量应该注意选定的值

private IRepositorio repositorio = EntityBeanFactory.getRepositorio();

吸气者和二传手

public void setRepositorio(IRepositorio repositorio) {

    this.repositorio = repositorio;
    System.out.println("valor after execute setRepositorio: "+repositorio);

}

public IRepositorio getRepositorio() {
    System.out.println("value in the method getRepositorio: "+repositorio);
    return repositorio;

}

主要的问题是没有调用setter方法,我没有转换器但转换器错误没有打印,但我创建了一个,但仍然没有任何反应

我的转换器

@FacesConverter(forClass=Repositorio.class)
public class RepositorioConverter implements Converter {
 private IRepositorioDAO repositorioDAO = DAOFactory.getRepositorioDAO();


@Override
public Object getAsObject(FacesContext context, UIComponent component,
        String idRepositorio) {
    if (idRepositorio==null || idRepositorio.trim().length()==0) {
        return null;
    }

    return repositorioDAO.find(Integer.parseInt(idRepositorio));
}

@Override
public String getAsString(FacesContext context, UIComponent component,
        Object value) {
    IRepositorio repositorio = (IRepositorio) value;
    Integer id = repositorio.getId();
    return id.toString();
}


}

最后我在@SessionScoped

中拥有了我的@ManagedBean

提前感谢您的时间和答案

1 个答案:

答案 0 :(得分:3)

  1. 如果使用转换器,则必须使用IRepositorio列表而不是使用SelectItem列表。
  2. p:selectOneMenu中使用自定义转换器时,应始终覆盖所涉及对象的equals()方法。对于你,你应该在repositorio类中覆盖equal()。这是覆盖equal()方法的一个例子。
  3. @Override
    public boolean equals(Object obj) {
        if (obj == null)
          return false;
        if (!(obj instanceof IRepositorio))
          return false;
        return ((ReferenceData) obj).getCode().equals(this.code);
    }