Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Conversor para SelectOneMenu,

Boa noite, Tenha uma aplicação em JSF, tenha uma relacionamento onetomany.

 <p:selectOneMenu  id="irmao" value="#{aniversarianteBean.niver.usuario}">
                                         <f:selectItems value="#{usuarioBean.usuarios}" var="usuario"
                                                        itemLabel="#{usuario.nome}" itemValue="#{usuario}"/>
                                     </p:selectOneMenu>

Quando tento executar no navegador essa função do selectonemenu, quando clico no botão salvar o erro persiste no navegador.

Erro de conversão ao definir o valor 'br.com.escola.modelo.Usuario@363fbe64' para 'null Converter'.navegador apresenta essa mensagem

Dei uma pesquisada e vi que preciso de um conversor parece, mas não tenha ideia como posso fazer, ou posso estar errando na sintaxe do relacionamento também.

Podem me ajudar?

7 respostas

acho que é só adicionar um .id ali no usuário.. nem acho válido fazer um conversor para objeto direto...

Alberto eu fiz aqui, mas o erro mudou para:

Erro de conversão ao definir o valor '1' para 'null Converter'.

eu estou fazendo o seguinte relacionamento.

Estou relacionando a classe usuário com Aniversariante, são UM usuário para MUITOS aniversariantes.

Classe Usuario

@OneToMany
    private List<Aniversariante> aniversariantes;

Classe Aniversariante

 @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
 @JoinColumn(name = "usuario_numCad")
    private Usuario usuario;

esta certo o código? com o relacinamento de UM para MUITOS?

Alberto ou alguem poderia me ajudar? Já tentei de diversas maneiras, mas o erro persiste

Erro de conversão ao definir o valor '1' para 'null Converter'.

esse 1 é o id do usuário que estou tentando relacionar com o selectonemenu.

Fala Felipe, tudo bem?

Dessa forma você precisa de um conversor. Segue um exemplo:

@FacesConverter(value = "usuarioConverter", forClass = Usuario.class)
public class UsuarioConverter implements Converter {

    public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {
        return seuMetodoParaProcurarPorUsuarioIDnoBanco(value);
    }

    public String getAsString(FacesContext ctx, UIComponent comp, Object obj) {
        Usuario usuario = (Usuario) obj;
        return String.valueOf(usuario.getId());
    }
}

O seu método para buscar no banco o usuario por id vai precisar de um EntityManager. Se vc estiver usando CDI vc pode injeta-lo com @Inject, lembrando que precisaria mudar o escopo desse converter para @RequestScoped do pocote do CDI.

A sua implementação no xhtml ficaria assim:

 <p:selectOneMenu  id="irmao" value="#{aniversarianteBean.niver.usuario}" converter="usuarioConverter">
    <f:selectItems value="#{usuarioBean.usuarios}" var="usuario" 
             itemLabel="#{usuario.nome}" itemValue="#{usuario}"/>
</p:selectOneMenu>

Espero ter ajudado =)

Samir, No caso o meu MetodoParaProcurarPorUsuarioIDnoBanco(value) seria esse:

public  List<Usuario> getUsuarios(){

        List<Usuario> lista = new ArrayList<Usuario>();

        EntityManager em =JPAUtil.getEntityManager();
        Query q = em.createQuery("select a from Usuario a",Usuario.class);

        lista = q.getResultList();
        em.close();

        return usuarios;
    }

Como eu faria essa implementação para o converter?

Felipe, nesse método que você está colocando, o retorno é um lista, mas o que precisamos é apenas um usuario.

Se você injetar o EntityManager no conversor, o retorno do getAsObject pode ser:

return entityManager.find(Usuario.class, Long.valueOf(value));
solução!

Boa noite Samir e Alberto, eu consegui fazer, agradeço a ajuda dos dois. Segue solução:

Fiz um converter

@FacesConverter(value = "usuarioConverter", forClass = Usuario.class)
public class UsuarioConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {

        EntityManager em = JPAUtil.getEntityManager();

        return em.find(Usuario.class, Long.valueOf(value));
    }

    @Override
    public String getAsString(FacesContext ctx, UIComponent comp, Object obj) {

           Usuario usuario = (Usuario) obj;  
           return String.valueOf(usuario.getNumCad());

    }
}

e mudei o mapeamento da classe Aniversariante

@ManyToOne(optional = false)
    private Usuario usuario;

Feito essas duas configurações funcionou.