selectOneMenu; - Problema para salvar em banco (agregacao de objetos selectOneMenu)

Ola a todos do Forum, estou a dias tentando resolver um problema do meu projeto, nao consigo salvar nada na tabela equipamentos usando agregacao
de objetos que na classe Cadequipamento possui um atributo do tipo Cadusuario que é a minha classe onde tenho o nome do usuario,
fiz um teste removendo a agregacao e funcionou certinho tudo adicionar,editar,remover perquisar mais nao e o certo, ao tentar salvar
recebi no console a msg :

[color=red]WARNING: There are some unhandled FacesMessages, this means not every FacesMessage had a chance to be rendered.
These unhandled FacesMessages are:

  • “j_id_jsp_1462597661_1:cadusuario”: O valor não é uma opção válida.[/color]


Tentei colocar esse converterObjeto

[color=blue]public class ObjectConverter implements Converter {

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

    if (value != null) {   
        return component.getAttributes().get(value);   
    }   
    return null;   
}   

@Override   
public String getAsString(FacesContext context, UIComponent component, Object value) {   
    if (value != null   
            && !"".equals(value)) {   
        component.getAttributes().put(value.toString(), value);   
        return value.toString();   
    }   
    return "";   
} 

}
[/color]

E recebi outra msg:

[color=red]An Error Occurred:
org.apache.jasper.el.JspELException: /equipamento/equipamento.jsp(97,14) ‘#{cadequipamentoBean.cadequipamento.cadusuario}’ Cannot convert 14 of type class java.lang.Integer to class br.com.solicitacao.model.Cadusuario

Caused by:
org.apache.jasper.el.JspELException - /equipamento/equipamento.jsp(97,14) ‘#{cadequipamentoBean.cadequipamento.cadusuario}’ Cannot convert 14 of type class java.lang.Integer to class br.com.solicitacao.model.Cadusuario
[/color]

Pagina equipamento.jsp
Diretorio: WebContent\equipamento
Classe: br.com.solicitacao.control.CadequipamentoBean (Faces-config.xml) cadequipamentoBean.cadequipamento
Classe: br.com.solicitacao.control.CadusuarioBean (Faces-config.xml) cadusuarioBean.cadusuariositem

[color=blue]<h:messages showDetail="#{true}" showSummary="#{false}" />
<h:selectOneMenu id=“cadusuario” immediate=“true” converter=“converterObjeto”

  value="#{cadequipamentoBean.cadequipamento.cadusuario}">

  <f:selectItems value="#{cadusuarioBean.cadusuariositem}" />

</h:selectOneMenu>[/color]

Classe da SelectItem: br.com.solicitacao.control.cadusuarioBean
Metodo: cadusuariositem

[color=darkblue]public List listausuarios() throws SQLException {

List<SelectItem> cadusuariosList = new ArrayList<SelectItem>();

PreparedStatement stmt = connection.prepareStatement("SELECT * FROM cad_usuario"); 

ResultSet rs = stmt.executeQuery(); 


cadusuariosList.add(new SelectItem("","-Selecionar Usuario-")); 

while (rs.next()) {

  // adicionando o objeto à lista

 cadusuariosList.add(new SelectItem(rs.getInt("id_usuario"), rs.getString("nm_usuario"))); 

}

rs.close();

stmt.close();

return cadusuariosList;

} [/color]

Minha Classe EquipamentoDAO

[color=blue]public String adiciona(Cadequipamento cadequipamento) throws SQLException {
	    
	
PreparedStatement stmt = this.connection.prepareStatement("REPLACE INTO cad_equipamento(id_equipamento,nm_equipamento,id_usuario) values (?, ?, ?)");
		// seta os valores cadusuario
		stmt.setInt(1,cadequipamento.getEqId());
		stmt.setString(2,cadequipamento.getEqNome());
		stmt.setInt(3,cadequipamento.getCadusuario().getUsId());
		// executa
		stmt.execute();
		stmt.close();

	    return "";
	
}

[/color]
Desde já agradeço a todos

Márcio Henrique
Fortaleza - CE

tive problemas em um projeto que estava desenvolvendo em salvar a classe Moeda no PedidoVenda no meu caso estava utilizando hibernate e jsf, resolvi dessa forma :

meu selectOneMenu da pagina de pedido mostrando as moedas disponiveis:

       <h:outputText value="Moeda:" />    
       <h:selectOneMenu id="moeda" value="#{pedidoController.pedidoVenda.moeda}">
         <f:selectItems value="#{pedidoController.moedas}" />
         <f:converter converterId="converterMoeda"/>
       </h:selectOneMenu>    
       <rich:message for="moeda" />

meu Metodo pedidoController.moedas

public List<SelectItem> getMoedas() {
      List<SelectItem> listMoedas = new LinkedList<SelectItem>();         
      for(Moeda moeda : Moeda.findAllMoedas()) {
        listMoedas.add(new SelectItem(moeda,moeda.getDsMoeda()));	
      }
      return listMoedas;
    }

meu Converter Moeda

public class ConverterMoeda implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
  Moeda moeda = Moeda.findMoeda(Long.parseLong(value));
  return moeda;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
	Moeda moeda = (Moeda)value;
	return moeda.getId().toString();
}	

}

o problema ocorre que quando vai salvar o pedido com a moeda selecionada ele tenta gravar um texto e não o objeto moeda usando o converter do jsf funcionou blz…

espero ter ajudado.

Oi Jacomete wrote, obrigado amigo pela ajuda, voce poderia me explicar como funciona esse converte

Meu projeto é assim tenho uma tabela usuario e uma tabela equipamento que pertence a um usuario por isso tenho que gravar o id do usuario na
tabela equipamento.

Minha classe Cadusuario possui os seguintes atributos

[color=blue] private int usId;
private String usNome;
private String usRg;
private String usCpf;[/color]

Minha classe [color=black]Cadequipamento[/color][b]

[color=blue] private int eqId;
private String eqNome;
private Cadusuario cadusuario;[/color]

Minha selectOneMenu

<h:messages showDetail="#{true}" showSummary="#{false}" />
<h:selectOneMenu id=“cadusuario” converter=“converterObjeto” value="#{cadequipamentoBean.cadequipamento.cadusuario}">
<f:selectItems value="#{cadusuarioBean.cadusuariositem}" />
</h:selectOneMenu>

SelectItem[color=#444444] [/color]

 public List<SelectItem> listausuarios() throws SQLException {   

        List<SelectItem> cadusuariosList = new ArrayList<SelectItem>();
        cadusuariosList.add(new SelectItem("","-Selecionar Usuario-"));   
	    PreparedStatement stmt = connection.prepareStatement("SELECT * FROM cad_usuario");        	
	    ResultSet rs = stmt.executeQuery();
	    
		while (rs.next()) {
			// adicionando o objeto à lista
			[color=orange]Cadusuario cadusuario = new Cadusuario();
			cadusuario.setUsId(rs.getInt("id_usuario"));
	 		cadusuario.setUsNome(rs.getString("nm_usuario"));
	 		cadusuario.setUsRg(rs.getString("rg_usuario"));
	 		cadusuario.setUsCpf(rs.getString("cpf_usuario"));[/color]
                            [b]//Aqui o indice seria o Id ou Objeto cadusuario?[/b][color=red] [/color]
			cadusuariosList.add(new SelectItem([color=darkblue]rs.getInt("id_usuario")[/color], rs.getString("nm_usuario"))); 
		
		}			     
		rs.close();
		stmt.close();	        	        
        return cadusuariosList;   
    }

Eu nao entendi como funciona o convert pq tenho que fazer isso e como seria, sou novo nesse mundo java e principalmente jsf esse projeto
e de uma disciplina da faculdade, como eu falei antes se eu colocar o atributo Cadusuario cadusuario como int cadusuariona tudo funciona nao tenho que fazer nada de convert mais colocando Cadusuario cadusuario nao grava nada no banco perd a referencia do objeto eu acho

no meu caso eu estava usando hibernate, pelo q vi vc naum tah usando.

No seu caso vc nem precisa usar um converter.

crie uma propiedade no seu bean #{cadequipamentoBean.idDoUsuario} deve ser Integer e naum um objeto cadusuario (isso dessa forma que vc esta fazendo)

ai vc faz o seguinte preenche seu List dessa forma q vc esta fazendo mesmo. Quando o cara selecionar o usuario ele ira guardar o valor do id na sua propiedade do bean #{cadequipamentoBean.idDoUsuario} seu selectOneMenu ficara assim:

<h:selectOneMenu id=“cadusuario” value="#{cadequipamentoBean.idDoUsuario}">
<f:selectItems value="#{cadusuarioBean.cadusuariositem}" />
</h:selectOneMenu>

na hora de gravar vc pega o id gravado na propiedade #{cadequipamentoBean.idDoUsuario} e grava na tabela equipamento;

No meu caso do exemplo da Moeda / Pedido meu converter faz o seguintes

quando preencho meu selectOneMenu ele tem no value o o objeto moeda e no label a descrição da moeda isso veio de um select que alimentou meu List

public class ConverterMoeda implements Converter {

esse metodo fica responsavel de quando for gravar no banco ele pega o id da moeda que foi colocado no selecOneMenu pelo metodo do converter getAsString que substituiu o objeto moeda pelo id do mesmo.

ai vc me pergunta pq? se eu ja tenho o objeto moeda para gravar no banco pq tenho que fazer isso?
Porque quano recupero a informação da moeda selecionado ele me retorna uma string que representa o objeto moeda mas o hibernate naum entende q aquilo eh um objeto moeda ai preciso usar o converter para buscar a moeda com aquele id esse eh o metodo que faz isso Moeda.findMoeda(Long.parseLong(value));

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Moeda moeda = Moeda.findMoeda(Long.parseLong(value));
return moeda;
}

esse metodo apenas recebe um objeto moeda e retorna o id do mesmo, que será usado depois para gravar no banco

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Moeda moeda = (Moeda)value;
return moeda.getId().toString();
}

}

espero ter ajudado e começe a usar hibernate que fica muito melhor trabalhar com os objetos quando for salvar no banco, vc manda ele salvar o objeto moeda no pedido e ele ja sabe que ele tem q guardar no banco o id da moeda, dessa forma vc trabalha na sua aplicação somente com objetos e não precisa ficar fazendo tudo na mão

Jacomete valeu mesmo pela atenção, o meu projeto é dessa forma pq sao duas disciplinas usando o mesmo projeto para Banco de Dados e POO, é sofrimento mesmo amigo tudo na mao grande, vou ventar aqui a sua dica

pow galera, forma o code com base na regra dos forum, nem olhei o que estava discutindo aqui, pq o codigo dessa forma fica dificil.