Tenho um aluno numa lista e ao clicar no registro dele redireciona para uma tela onde posso cadastrar esse aluno em um curso selecionado numa combo
carregada do banco de dados…
public List<SelectItem> getListaTodosCursos() {
//cria(Abre) a sessão com o Banco
Session session = HibernateUtil.getSession();
//Faz a query de consulta á tabela Curso do banco de dados
//e retorna todos os cursos cadastrados
Query q = session.createQuery("from Curso");
//Lista que recebe o resultado da consulta
List<Curso> cursos = q.list();
//lista que irá preencher a combo
List<SelectItem> listaCursos = new ArrayList<SelectItem>();
//pega cada Objeto Curso dentro de cursos(lista que recebe o resultado da query) e add dentro de um novo selectItem(listaCursos)
for(Curso c : cursos){
listaCursos.add(new SelectItem(c, c.getDescricao()));
}
return listaCursos;
}
O PROBLEMA É QUE QUANDO SELECIONO UM VALOR NA COMBO E SUBMETO PRA GRAVAR NO BANCO ELE JÁ CHAMA A SEGUINTE VALIDAÇÃO NA TELA ANTES DE CHAMAR QUALQUER MÉTODO:
Conversion Error setting value ‘entidades.Curso@20’ for ‘null Converter’
Não estou sabendo lidar com esse erro, já percebi que ele precisa de um CONVERTER, Mas num entendi como funciona ainda…
Se puderem ajudar…
Na verdade, você criou metáde do caminho, conseguiu popular uma combo e exibí-la na tela, porém na hora de retornar um valor selecionado, ele retorna a instância selecionada.
Você precisa criar um converter. Uma classe Java que implementa javax.faces.convert.Converter.
E deve ser. Declara no faces-config.xml (caso sua versão seja 1.2 do JSF)
E ser referenciada no componente ao qual deverá efetuar a conversão.
Para declarar no faces-config, deveremos colocar a tag “converter”, veja o exemplo:
Vejamos um exemplo de implementação da CursoConverter:
package br.gov.ba.cedasc.spei.web.util.converter;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
/**
* Exemplo de Converter.
* @author Inocêncio T. de Oliveira
*/
public class CursoConverter implements Converter {
/**
* Faz o processo: TELA => BEAN
*
* Quando um elemento de um combo é selecionado na tela, e portanto, retornado
* ao bean como uma instância de uma entidade por exemplo.
* @param context
* @param component
* @param value
* @return
*/
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value != null && !value.isEmpty()) {
//seu método de pesquisa para trazer uma instância de Curso
return Curso.findById(new Long(value));
}
return null;
}
/**
* Faz o processo BEAN => TELA
*
* Quando um elemento do bean é carregado e deverá ser marcado no combo.
* @param context
* @param component
* @param value
* @return
*/
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value instanceof Curso) {
Curso curso = (Curso) value;
return curso.getId().toString();
}
return "";
}
}
Depois de feito isso (claro, adaptando a classe do CursoConverter a sua realidade), você só precisa fazer a sua referência no componente desejado, no seu caso, um selectOneMenu. O ID do converter "converterCurso" (declarado no faces-config) será usado para o seu componente indentificar o converter necessário.
Estou com o seguinte problema,
Meu selectItens, após a execução de um botão, está perdendo a referência (voltando para o primeiro registro da lista),
detalhe: Em nenhum momento “zero” o value do SelectOnMenu, apenas atualizo o objeto, pois na action do botão o valor da minha Lista do select Item é atualizada.
Acredito que quando disparo o Botão, o value do meu SelectOnMenu não está sendo Convertido novamente.
Existe essa possibilidade? tenho que converter o Objeto na mão?