SelectOneMenu dinâmico - aparentemente tudo certo, mas não recarrega a lista

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

kara pq vc não usa p:ajax em vez do f:ajax

é só fazer assim <p:ajax process = “@this” update = “subCategorias” event = “onclick” />

Acho que assim funciona agora não da pra testar mas fiz algo parecido esses dias.

vc já debugou ou metodo “carregarSubCategorias”?

coloca o código da classe categoriaConverter pra gente da uma olhada também

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()));  
    }  
}  

Tenta passar um long um um inteiro
for (Categoria cat : lista) {
categoriasDeProdutos.add(new SelectItem(cat.getId(), cat.getNome()));

[code]public final void carregarListaDeCategoriasAtivasParaCombobox() {

CategoriaDaoImp categoriaDao;
categoriaDao = new CategoriaDaoImp();

categoriasDeProdutos = new ArrayList();

List lista = categoriaDao.list(“ativas”);

for (Categoria cat : lista) {
categoriasDeProdutos.add(new SelectItem(cat, cat.getNome()));
}
}
[/code]

Tenta passar um long um um inteiro

for (Categoria cat : lista) { 
categoriasDeProdutos.add(new SelectItem(cat.getId(), cat.getNome()));
}

Pessoal,

Valeu pela ajuda.

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;
    }

}

Pessoal,

Debugando o projeto, vi que o erro está mesmo nessa linha:

Do método carregarSubCategorias, em produtoController.
A variável idCategoria está recebendo esse valor: “sgm.model.Categoria[ id=1 ]”

O método subCategoriaDao.listByCategoria(idCategoria); está listando as subcategorias, de acordo com o id da categoria, sem problemas.

Percebi também que esse for:

for (SubCategoria subCategoria : tmp) {
            subCategorias.add(new SelectItem(subCategoria, subCategoria.getNome()));
            subCategoria = null;
        }   

Só está colocando uma única subcategoria na lista.

Se alguém puder me ajudar a resolver esse problema.

Pessoal,

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

Pessoal,

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.

Ainda não resolvei esse problema.

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.

view:

[code]
<p:selectOneMenu id=“categorias” widgetVar=“categorias"
value=”#{produtoController.produto.subCategoria.categoria}“
valueChangeListener=”#{subCategoriaController.carregarSubCategoriasPorCategoria}"
converter=“categoriaConverter"
required=“true"
requiredMessage=“Por favor, selecione uma categoria.”>
<f:selectItem itemLabel=“Selecione…”/>
<f:selectItems value=”#{categoriaController.listaCategoriasParaCombobox}”/>
<p:ajax event=“change” update=“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=”#{subCategoriaController.listaSubCategoriasParaCombobox}”/>
</p:selectOneMenu> [/code]

MB

[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