[RESOLVIDO]"O nosso velho e bom Converter"

Olá a todos,
estou com uma dúvida que já se arrasta por alguns dias e o cenário é o seguinte:

tenho um formulário a ser preenchido e nele eu uso uma tag <p:selectOneMenu> onde
é populada com valores vindos do banco de dados, ok. O lance é quando
vou enviar o formulario para o servidor, nao estou conseguindo converter a string para o Objeto correspondente
na minha aplicação. Abaixo está parte do código do meu formulario no xhtml:

<h:outputLabel value="Empresa:" for="empresa"></h:outputLabel>
      <p:selectOneMenu id="empresa" value="#{empresaBean.empresa}" >
      <f:selectItems id="itensEmpresa" value="#{empresaBean.empresasSelect}" var="empre" itemLabel="#{empre.empresa}" itemValue="#{empre.idEmpr}"></f:selectItems>
</p:selectOneMenu>

Aqui está o codigo do metodo que é chamado no atributo value da tag <f:selectItems> acima:

public List<SelectItem> getEmpresasSelect() throws SQLException {
	  
	  if(empresaSelect == null) {
	  
	         empresaSelect = new ArrayList<SelectItem>();
	  
	         EmpresaRN empresaRN = new EmpresaRN(); List<Empresa> empresas = empresaRN.listar();
	  
	         for(Empresa a : empresas) { empresaSelect.add(new
	         SelectItem(a.getIdEmpr(), a.getEmpresa()));
	  
	          }//fim do for
	  
	  }//fim do if
	  
	  return empresaSelect;
	  
 }//fim do metodo getEmpresaSelect

Com essa implementação o navegador retorna um erro tipo: "Conversion Error setting value ‘41’ for ‘null Converter’. ", beleza, então é necessário implementar um conversor para que a operação transforme um objeto em texto e um texto em objeto.
Implementei vários exemplos que achei na internet, todos dando um erro na hora de fazer cast no atributo Integer na minha classe Empresa(mais especificamente na linha 31 abaixo). Segue o código da classe Converter:


@FacesConverter(forClass = Empresa.class)
public class EmpresaConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) {

		if (value != null && value.trim().length() > 0) {

			int codigo = Integer.valueOf(value);

			try {
				EmpresaRN empresaRN = new EmpresaRN();
				return empresaRN.carregar(codigo);

			} catch (Exception e) {
				throw new ConverterException(
						"Nao foi possivel converter o codigo da empresa"
								+ value + "." + e.getMessage());
			}// fim do bloco try/catch
		}// fim do if

		return null;
	}// fim do metodo getAsObject

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {

		if (value != null) {
			
			Empresa empresa = (Empresa) value;
			return empresa.getIdEmpr().toString();
		}

		return "";
	}

}// fim da classe EmpresaConverter

Quando implemento a classe acima o formulário nem chega a ser exibido já da o erro 500 direto.
Estou usando:
[list]JSF2.0 [/list]
[list]primefaces3.2[/list]
[list]tomcat7[/list]

Já pesquisei em vários sites e também aqui no forum do GUJ, se alguém puder ajudar agradeço desde já.
Em anexo vai duas imagens do navegador quando os erros são retornados.

Obrigado a todos pela atenção.
:slight_smile:




De itemValue="#{empre.idEmpr}"
para itemValue="#{empre}"

Boa noite jakefrog,

desculpa a demora da resposta mas é o seguinte:
estava formatando o sistema aqui do notebook e estou voltando os arquivos
assim que terminado vou testar a sua dica.

Obrigado pela resposta e espero que com sua ajuda consiga resolver o problema.

Boa tarde a todos,

segui a dica do jakefrog não deu certo mas a mensagem de erro agora mudou(rsrsrs).
Agora o console do Tomcat me retorna um erro de NullPointerException na cara(kakaka).
Já fiz um debug no código e tenho certeza que o retorno da lista que vem do banco de dados
não é null em nenhum de seus atributos.
Será que eu estou esquecendo de estanciar algum objeto em algum lugar, o que acham ?

Abaixo segue a saida do console do Tomcat:


Olha onde aconteceu o nullponiter.

O stactrace (mensagem com erro) vai te mostrar exatamente onde está acontecendo o erro, qual variável está null.

Então,
segui o stacktrace e verifiquei o erro nesse método que insere os dados no banco e justamente no ID que vem do selectOneMenu esse cara aqui ó(linha 10):


	public void salvar(Usuario usuario) throws SQLException {

		String sql = "insert into usuario(empresaId, nome, login, senha, email, ativo) values (?, ?, ?, ?, ?, ?)";

		try {

			PreparedStatement stmt = conexao.prepareStatement(sql);

			// seta os valores
			stmt.setInt(1, usuario.getEmpresaId());
			stmt.setString(2, usuario.getNome());
			stmt.setString(3, usuario.getLogin());
			stmt.setString(4, usuario.getSenha());
			stmt.setString(5, usuario.getEmail());
			stmt.setBoolean(6, usuario.isAtivo());

			// executa
			stmt.execute();
			stmt.close();

		} catch (SQLException e) {

			throw new RuntimeException(e);
		}

		finally {
			System.out.println("Conexao fechada, salvar usuario");
			conexao.close();
		}// fim do bloco try/catch/finally

	}// fim do metdo salvar

Parece que o objeto Usuario não está vindo com esse valor setado, mas como tinha comentado quando faço essa listagem esse ID está preenchido:


 empresaSelect = new ArrayList<SelectItem>();  
        
             EmpresaRN empresaRN = new EmpresaRN(); List<Empresa> empresas = empresaRN.listar();  
        
             for(Empresa a : empresas) { empresaSelect.add(new  
             SelectItem(a.getIdEmpr(), a.getEmpresa()));  
        
              }//fim do for  

Jakefrog será que tu tem mais alguma dica ai ?

Boa noite a todos,

finalmente resolvi a parada aqui galera, depois de muito custo.
O problema maior foi eu(Vacilão!!!) estar editando um arquivo xhtml
errado essa foi o que mais fudeu a parada. Mas enfim consegui
fazendo um converter para as duas classes que eu estava trabalhando(Empresa, Usuario).
Abaixo vai o código final:

usuario.xhtml

<h:outputLabel value="Empresa:" for="empresa"></h:outputLabel>
  <p:selectOneMenu id="empresaSelecionada" value="#{usuarioBean.usuario.empresaId}">				
	<f:selectItems id="itensEmpresa" value="#{usuarioBean.empresas}"></f:selectItems>
  </p:selectOneMenu>

UsuarioBean:

public List<SelectItem> getEmpresas() throws ClassNotFoundException, SQLException {
		
		if(this.empresas == null) {
			
			this.empresas = new ArrayList<SelectItem>();
			EmpresaRN empresaRN = new EmpresaRN();
			List<Empresa> empresas = empresaRN.listar();

                       for(Empresa empresa : empresas) {
				
				empresas.add( new SelectItem(empresa.getIdEmpr(), empresa.getEmpresa()));
				
			}//fim do for
			
			
		}//fim do if
		
		return empresas;
	}
	

Obrigado ai jakefrog pela força.