大家好,我在尝试从 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
预先感谢您的时间和答复
最佳答案
- 如果您使用转换器,则必须使用 IRepositorio 列表,而不是使用 SelectItem 列表。
- 在
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/