java - “选择一个”菜单未将所选值设置为后端

标签 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 方法,效果很好,我可以看到列表中的所有元素 选择一个菜单

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;

}

我的存储库变量,该变量应该捕获所选值

private IRepositorio repositorio = EntityBeanFactory.getRepositorio();

getter 和 setter

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. 如果您使用转换器,则必须使用 IRepositorio 列表,而不是使用 SelectItem 列表。
  2. p:selectOneMenu 中使用自定义转换器时,您应始终重写所涉及对象的 equals() 方法。对于您来说,您应该在存储库类中重写 equal() 。这是重写 equal() 方法的示例。
@Override
public boolean equals(Object obj) {
    if (obj == null)
      return false;
    if (!(obj instanceof IRepositorio))
      return false;
    return ((ReferenceData) obj).getCode().equals(this.code);
}

关于java - “选择一个”菜单未将所选值设置为后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26061451/

相关文章:

javascript - 在 Tomcat 7.0 服务器上将 Ajax 与 JSF 结合使用时遇到问题

primefaces - 从 PrimeFaces 10.0.0 到 11.0.0 是否发生了更改,使 TreeNode 变成了原始类型?

java - 在 Android 键盘中显示自定义表情

java - JAVA 中 XML 的有序列表级别

jsf - 如何使用 f :viewParam? 对 GET 请求执行操作

jsf-2 - Primefaces 数据表中单选按钮的 onRowSelect

jsf - primefaces panelgrid colspan无法正常工作

java - 检查运行时互联网连接是否丢失

java - 与常规应用程序的测试类冲突

jsf - 如何在EL表达式中串联字符串?