Pessoal,
tenho dois selectOneMenu, um de Categorias e outro de SubCategorias. Quero que o selectOneMenu de subcategorias seja dinâmico, ou seja, seja carregado de acordo com a categoria selecionada anteriormente. Já fiz vários testes, várias pesquisas e ainda não descobri porque não está funcionando como eu quero.
Por favor, alguém me ajude a decifrar esse mistério. Seguem meus códigos:
View:
<p:selectOneMenu id="categorias" widgetVar="categorias" value="#{produtoController.produto.subCategoria.categoria}" valueChangeListener="#{produtoController.carregarSubCategorias}" converter="categoriaConverter" required="true" requiredMessage="Por favor, selecione uma categoria.">
<f:selectItem itemLabel="Selecione..."/>
<f:selectItems value="#{produtoController.categoriasDeProdutos}"/>
<f:ajax event="change" render="subCategorias" />
</p:selectOneMenu>
<p:selectOneMenu id="subCategorias" widgetVar="subCategorias" value="#{produtoController.produto.subCategoria}" converter="subCategoriaConverter"
required="true" requiredMessage="Por favor, selecione uma subcategoria.">
<f:selectItem itemLabel="Selecione..."/>
<f:selectItems value="#{produtoController.subCategorias}"/>
</p:selectOneMenu>
MB
private List<SelectItem> categoriasDeProdutos;
private List<SelectItem> subCategorias;
public final void carregarListaDeCategoriasAtivasParaCombobox() {
CategoriaDaoImp categoriaDao;
categoriaDao = new CategoriaDaoImp();
categoriasDeProdutos = new ArrayList<SelectItem>();
List<Categoria> lista = categoriaDao.list("ativas");
for (Categoria cat : lista) {
categoriasDeProdutos.add(new SelectItem(cat, cat.getNome()));
}
}
public final void carregarListaDeSubCategoriasAtivasParaCombobox() {
SubCategoriaDaoImp subCategoriaDao;
subCategoriaDao = new SubCategoriaDaoImp();
subCategorias = new ArrayList<SelectItem>();
List<SubCategoria> lista = subCategoriaDao.list("ativas");
for (SubCategoria cat : lista) {
subCategorias.add(new SelectItem(cat, cat.getNome()));
}
}
public void carregarSubCategorias(ValueChangeEvent evento) {
String idCategoria = evento.getNewValue().toString();
subCategorias = new ArrayList<SelectItem>();
SubCategoriaDaoImp subCategoriaDao;
subCategoriaDao = new SubCategoriaDaoImp();
List<SubCategoria> tmp;
tmp = subCategoriaDao.listByCategoria(Integer.parseInt(idCategoria));
for (SubCategoria subCategoria : tmp) {
subCategorias.add(new SelectItem(subCategoria.getId(), subCategoria.getNome()));
subCategoria = null;
}
}
DAO
public List<SubCategoria> listByCategoria(int idCategoria) {
CategoriaDaoImp catDao;
catDao = new CategoriaDaoImp();
Categoria categoria = new Categoria();
categoria = (Categoria)catDao.getCategoria(idCategoria);
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
Criteria criteria = session.createCriteria(SubCategoria.class);
criteria.add(Restrictions.eq("categoria", categoria));
List<SubCategoria> lista = criteria.list();
t.commit();
return lista;
}
Nada acontece no selectOneMenu das subcategorias, posso escolher qualquer categoria que as subcategorias não são recarregadas. Nenhum erro aparece. Apenas isso aparece no log do Apache:
Já tentei enviar o id da categoria na mão para o DAO, por achar que o valuChangeListener está enviando isso: sgm.model.Categoria[ id=1 ], ao invés do código em si, mas mesmo assim não funciona