selectOneMenu - valor inválido quando dou um submit - JSF 1.2 - NAO RESOLVIDO

13 respostas
mandaglio

Galera é o seguinte sou novo em JSF e estamos tendo uma dificuldade que aparentemente parece ridicula, mas nao estou conseguindo resolver, se alguem puder me dar um help vou ficar agradecido…vamos lá.

Temos um formulario que possui dois selectOneMenu, o 1º carrega todas as siglas dos estados, o 2º carrega todas os municipios referente ao estado via ajax, até aí tudo bem, o problema é quando vamos submeter o formulário, aparece uma mensagem de valor inválido… já tentamos sobrescrever o metodo equals e hash code, enfim diversas formas…

segue cod abaixo:

Eu tenho um selectOneMenu carregado com valores sigla de todos os estados:

<h:outputLabel value="#{ msg.uf }" />
	<h:panelGroup>
		<h:selectOneMenu required="true" value="#{ cadastroPbm.pbm.sgEstado }" id="uf">
			<f:selectItems value="#{ cadastroPbm.comboUF }" />
			<a4j:support event="onchange" ajaxSingle="true" action="#{ cadastroPbm.popularComboCidades }" reRender="uf, cidade" />
		</h:selectOneMenu>
			<rich:message for="uf" styleClass="erro" />
        </h:panelGroup>

Renderizando para este outro selectOneMenu:

<h:outputLabel value="#{ msg.municipio }" />
	<h:panelGroup>
		<h:selectOneMenu value="#{ cadastroPbm.pbm.cdCidade }" id="cidade">
			<f:selectItems value="#{ cadastroPbm.comboCidades }" />
		</h:selectOneMenu>
		<rich:message for="cidade" styleClass="erro" />
        </h:panelGroup>

Segue o Mbean completo:

public class CadastroPbmsMBean{

	private Logger log = Logger.getLogger( this.getClass().getName() );
	private TbPbmVO pbm = new TbPbmVO();
	private List< SelectItem > comboUF = new ArrayList< SelectItem >();
	private List< SelectItem > comboCidades = new ArrayList< SelectItem >();
	private GenericInsertOrUpdateDelegate delegateInsert = new GenericInsertOrUpdateDelegate();
	private GenericSelectObjectDelegate delegateSelect = new GenericSelectObjectDelegate();

	public TbPbmVO getPbm(){
		return pbm;
	}

	public void setPbm( TbPbmVO pbm ){
		this.pbm = pbm;
	}

	public List< SelectItem > getComboUF(){
		if( comboUF == null || comboUF.size() == 0 ){
			String[] listaUF = Constantes.Web.listaUF;
			comboUF.add( new SelectItem( null, "" ) );
			for( int x = 0; x < listaUF.length; x ++ ){
				comboUF.add( new SelectItem( listaUF[ x ], listaUF[ x ] ) );
			}
		}
		return comboUF;
	}

	public List< SelectItem > getComboCidades(){
		return comboCidades;
	}

	public String salvar(){

		try{
			String cnpj = Util.tratarCnpj( pbm.getNrCnpjPbm() );
			pbm.setNrCnpjPbm( cnpj );

			LoginVO loginVO = ( LoginVO ) Util.getFromSessionMap( Constantes.Web.SessionMap.LOGIN );
			long cdOperador = loginVO.getCdOperador();
			Timestamp dtAtual = new Timestamp( new Date().getTime() );

			pbm.setDtAlteracao( dtAtual );
			pbm.setCdOperadorAlteracao( cdOperador );

			if( pbm.getDtCadastro() == null ){
				pbm.setDtCadastro( dtAtual );
			}
			if( pbm.getCdOperadorCadastro() == null ){
				pbm.setCdOperadorCadastro( cdOperador );
			}

			pbm.setFlOk( Constantes.VL_FIXO_ZERO );
			pbm.setFlVlDivergente( Constantes.VL_FIXO_ZERO );
			pbm.setFlWeb( Constantes.VL_FIXO_ZERO );

			GenericVO genericVO = new GenericVO();
			List< TbPbmVO > lista = new ArrayList< TbPbmVO >();

			lista.add( pbm );
			genericVO.setListObjetoVO( lista );
			genericVO.setNmClassePojo( Constantes.DAO.POJO.NM_TB_PBM );

			List< GenericVO > listGenericVO = new ArrayList< GenericVO >();
			listGenericVO.add( genericVO );
			
			delegateInsert.execute( listGenericVO );
			Util.addGlobalMessage( FacesMessage.SEVERITY_INFO, Constantes.MSG_NEG.CADASTRO_SUCESSO );

		} catch( GenericInsertOrUpdateDelegateException ge ){
			log.log( Level.SEVERE, ge.getMessage(), ge );
			Util.addGlobalMessage( FacesMessage.SEVERITY_ERROR, ge.getMessage() );
		
		} catch( Exception e ){
			log.log( Level.SEVERE, "Erro ao salvar PBMS Web: " + e.getMessage(), e );
			Util.addGlobalMessage( FacesMessage.SEVERITY_ERROR, e.getMessage() );
		}
		
		return Constantes.Forward.CADASTRO_PBMS;
	}

	@SuppressWarnings( "unchecked" )
	public void popularComboCidades() throws GenericSelectObjectDelegateException, Exception{
		try{
			comboCidades.clear();
			comboCidades.add( new SelectItem( null, "" ) );
			
			if( pbm.getSgEstado() != null && !pbm.getSgEstado().equals( "" ) ){
				
				String[] fields = new String[]{ Constantes.DAO.POJO.FIELD.SG_ESTADO };
				Object[] param = new Object[]{ pbm.getSgEstado() };
				List< TbCepCidadeVO > list = ( List< TbCepCidadeVO > ) delegateSelect.recuperarListaObjeto(
						Constantes.DAO.POJO.NM_TB_CEP_CIDADE, fields, param, TbCepCidadeVO.class );
				for( TbCepCidadeVO vo : list ){
					comboCidades.add( new SelectItem( vo.getCdCidade(), vo.getDsCidade() ) );
				}
			}
			
		} catch( GenericSelectObjectDelegateException ge ){
			log.log( Level.SEVERE, ge.getMessage(), ge );
			throw new  GenericSelectObjectDelegateException( ge );
		} catch( Exception e ){
			log.log( Level.SEVERE, e.getMessage(), e );
			throw new Exception( e );
		}
	}
}

o VO:

import java.io.Serializable;

public class TbCepCidadeVO implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private String cdCidade;
	private String dsCidade;
	private String sgEstado;
	public String getCdCidade(){
		return cdCidade;
	}
	public void setCdCidade( String cdCidade ){
		this.cdCidade = cdCidade;
	}
	public String getDsCidade(){
		return dsCidade;
	}
	public void setDsCidade( String dsCidade ){
		this.dsCidade = dsCidade;
	}
	public String getSgEstado(){
		return sgEstado;
	}
	public void setSgEstado( String sgEstado ){
		this.sgEstado = sgEstado;
	}
	@Override
	public int hashCode(){
		final int prime = 31;
		int result = 1;
		result = prime * result + ( ( cdCidade == null )? 0 : cdCidade.hashCode() );
		result = prime * result + ( ( dsCidade == null )? 0 : dsCidade.hashCode() );
		result = prime * result + ( ( sgEstado == null )? 0 : sgEstado.hashCode() );
		return result;
	}
	@Override
	public boolean equals( Object obj ){
		if( this == obj )
			return true;
		if( obj == null )
			return false;
		if( getClass() != obj.getClass() )
			return false;
		TbCepCidadeVO other = ( TbCepCidadeVO ) obj;
		if( cdCidade == null ){
			if( other.cdCidade != null )
				return false;
		} else if( ! cdCidade.equals( other.cdCidade ) )
			return false;
		if( dsCidade == null ){
			if( other.dsCidade != null )
				return false;
		} else if( ! dsCidade.equals( other.dsCidade ) )
			return false;
		if( sgEstado == null ){
			if( other.sgEstado != null )
				return false;
		} else if( ! sgEstado.equals( other.sgEstado ) )
			return false;
		return true;
	}
	
	
	

}

algum ser iluminado poderia me ajudar ?

13 Respostas

lele_vader

Uma coisa que vi aqui é que o nome do seu managed bean é CadastroPbmsMBean e você referencia ele na tela como
cadastroPbm, sendo que você não sobrecreveu o nome no managedBean.
Não sei se é isso, mas foi algo que eu observei.

mandaglio

lele_vader:
Uma coisa que vi aqui é que o nome do seu managed bean é CadastroPbmsMBean e você referencia ele na tela como
cadastroPbm, sendo que você não sobrecreveu o nome no managedBean.
Não sei se é isso, mas foi algo que eu observei.

Olá lele_vader, boa tarde!

eu mapeei ele no facesConfig.xml

<managed-bean>
	<managed-bean-name>cadastroPbm</managed-bean-name>
	<managed-bean-class>br.com.empresa.pbm.mbean.CadastroPbmsMBean</managed-bean-class>
	<managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Muito obrigado pela atenção! :smiley:

lele_vader

Na sua classe TbCepCidadeVO não tem getCdCidade, o que faz vir null lá no managed bean eu acho.

Tenta criar o método para ver.

mandaglio

lele_vader:
Na sua classe TbCepCidadeVO não tem getCdCidade, o que faz vir null lá no managed bean eu acho.

Tenta criar o método para ver.

Pior que tem sim está nesse trecho

private String sgEstado;  
    public String getCdCidade(){  
        return cdCidade;  
    }

Não estou conseguindo entender o que está acontecendo…

Obrigado!

lele_vader

Aqui na listagem que enviou não tem não.
Tem certeza que tem o método ?

Qual valor que chega no campo quando está no servidor ?

mandaglio

lele_vader:
Aqui na listagem que enviou não tem não.
Tem certeza que tem o método ?

Qual valor que chega no campo quando está no servidor ?

Então os valores estao disponibilizados pela variavel no Mbean (pbm) :

private TbPbmVO pbm = new TbPbmVO();

public TbPbmVO getPbm(){
		return pbm;
	}

	public void setPbm( TbPbmVO pbm ){
		this.pbm = pbm;
	}

as variaveis vem populadas os problema é quando dou um submit, parece que nao aceita os valores e dá invalido. =(

Obrigado pela atenção lele_vader! =)

mandaglio

será que foi isso que entendi ?

lele_vader

Dá algum stack trace ?

Nem entra no managed bean ?

mandaglio

lele_vader:
Dá algum stack trace ?

Nem entra no managed bean ?

Pior que não dá nenhum stack trace e nem da erro de nada. Não chega nem entrar no Mbean … para na validação mesmo…é muito estranho. Conversei com varias pessoas e ninguém sabe direito o que é…nao sei se é pau do JSF… mas continuo tentando aqui.

lele_vader

Tá complicado mesmo.
Quando descobrir me avisa.
Se pensar em algo a mais lhe aviso.

mandaglio

lele_vader:
Tá complicado mesmo.
Quando descobrir me avisa.
Se pensar em algo a mais lhe aviso.

Ok. Obrigado, vou continuar tentando!

mandaglio

Alguém mais desconfia o que pode ser ? ou alguma alternativa ? :?

mandaglio

alguém?

Criado 31 de julho de 2012
Ultima resposta 1 de ago. de 2012
Respostas 13
Participantes 2