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:
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
Troquei a tag f:ajax pela p:ajax, e agora aparece esse erro:
Com relação ao método carregarListaDeSubCategoriasAtivasParaCombobox(), que vocês sugeriram de eu trocar essa linha:
por essa linha : subCategorias.add(new SelectItem(cat.getId(), cat.getNome()));
O problema é o meu converter, se eu enviar o ID ao invés do objeto inteiro, dá erro na hora de converter. Também estou achando que o erro pode estar aí, mas não estou conseguindo alterar meu converter.
CONVERTER:
@FacesConverter(value = "subCategoriaConverter")
public class SubCategoriaConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String newValue) {
SubCategoria subCategoria = null;
try {
Integer id = new Integer(newValue);
SubCategoriaDaoImp subCategoriaDao = new SubCategoriaDaoImp();
subCategoria = subCategoriaDao.getSubCategoria(id);
}
catch(Throwable ex) {
ResourceBundle bundle = ResourceBundle.getBundle("messages");
FacesMessage msg = new FacesMessage(bundle.getString("subCategoria_convertion_message"));
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ConverterException(msg);
}
return subCategoria;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
String val = null;
try {
SubCategoria subCategoria = (SubCategoria) value;
val = Integer.toString(subCategoria.getId());
}
catch(Throwable ex) {
ResourceBundle bundle = ResourceBundle.getBundle("messages");
FacesMessage msg = new FacesMessage(bundle.getString("subCategoria_convertion_message"));
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ConverterException(msg);
}
return val;
}
}
O problema está nessa linha: String idCategoria = evento.getNewValue().toString();
Sei que é por causa do meu converter.
Mas mesmo eu setando o id da categoria na mão, assim:List<SubCategoria> tmp;
tmp = subCategoriaDao.listByCategoria(2); o selectOneMenu das subcategorias não é atualizado. Já debuguei o projeto várias vezes, está tudo certo, colocando o id da categoria na mão, o dao retorna a lista de subcategorias certinha. O problema está mesmo na hora de recarregar o selectOneMenu das subcategorias.
Já tentei com p:ajax e também com f:ajax, mesmo assim não consegui nenhum resultado positivo
Alguem tem ideia de como posso resolver esse problema. Aparentemente o problema está no ajax, na hora de recarregar a lista de subcategorias, de acordo com a categoria selecionada.
Alterei a chamada dos métodos, coloquei em outro MB. E nada mudou.
Já depurei várias vezes e não acho o erro. A lista está sendo carregada normalmente, eu depuro e vejo isso, pois estou enviando o id da categoria na mão, já que o meu converter ainda está errado. Mesmo depois disso tudo ainda não consegui exito.
Meu selectOneMenu de subcategorias ainda não está sendo atualizado ao escolher uma categoria, em outro selectOneMenu.
[code]
public void carregarSubCategoriasPorCategoria(ValueChangeEvent evento) {
String idCategoria = evento.getNewValue().toString();
listaSubCategoriasParaCombobox = new ArrayList<SelectItem>();
List<SubCategoria> lista = subCategoriaDao.listByCategoria(2);
//tmp = subCategoriaDao.listByCategoria(Integer.parseInt(idCategoria));
for (SubCategoria subCat : lista) {
listaSubCategoriasParaCombobox.add(new SelectItem(subCat, subCat.getNome()));
}
} [/code]
Os métodos tanto na DAO quanto no MB estão corretos, eu depuro e observo isso. A lista está sendo preenchida corretamente, mesmo assim nada acontece no selectOneMenu que quero