[RESOLVIDO] - O valor não é válido

10 respostas
N

Galera, eu sei que essa dúvida já tá batida, mas acredito que meu problema seja um pouco fora do comum…

O que acontece é que quando seleciono um município X e mando cadastrar, ele cadastra numa boa, mas quando seleciono um município Y não cadastra.
Tipo, to lá na página de cadastro e seleciono o município Xapuri (Acre) e mando cadastrar/atualizar e ele vai numa boa, mas se eu selecionar a cidade Rio Branco (Acre) ele não cadastra, dá erro de validação.

Segue abaixo alguns trechos de como está minha implementação:

Modelo (com hashCode e equals sobrescritos):

@Entity
@Table(name = "ger_tb_cidade", catalog = "geral", uniqueConstraints = {
		@UniqueConstraint(columnNames = { "fk_id_estado", "nm_cidade" }),
		@UniqueConstraint(columnNames = "cd_ibge") })

@SuppressWarnings("serial")
@TypeDef(name = "flagEnum", typeClass = PgEnumUserType.class, parameters = 
	{@Parameter(name = "enumClassName", value = "inforcoop.seiam.modelo.tipo.Flag")})
public class GerTbCidade implements java.io.Serializable {
	private Integer pkIdCidade;
	private GerTbEstado gerTbEstado;
	private String cdIbge;
	private String nmCidade;
	private Flag flRemovido;
	private Set<CliTbEmpreendimento> cliTbEmpreendimentos = new HashSet<CliTbEmpreendimento>(
			0);
	private Set<GerTbPessoa> gerTbPessoas = new HashSet<GerTbPessoa>(0);

	public GerTbCidade() {
	}

	public GerTbCidade(GerTbEstado gerTbEstado, String cdIbge, String nmCidade,
			Flag flRemovido) {
		this.gerTbEstado = gerTbEstado;
		this.cdIbge = cdIbge;
		this.nmCidade = nmCidade;
		this.flRemovido = flRemovido;
	}

	public GerTbCidade(GerTbEstado gerTbEstado, String cdIbge, String nmCidade,
			Flag flRemovido, Set<CliTbEmpreendimento> cliTbEmpreendimentos,
			Set<GerTbPessoa> gerTbPessoas) {
		this.gerTbEstado = gerTbEstado;
		this.cdIbge = cdIbge;
		this.nmCidade = nmCidade;
		this.flRemovido = flRemovido;
		this.cliTbEmpreendimentos = cliTbEmpreendimentos;
		this.gerTbPessoas = gerTbPessoas;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "pk_id_cidade", unique = true, nullable = false)
	public Integer getPkIdCidade() {
		return this.pkIdCidade;
	}

	public void setPkIdCidade(Integer pkIdCidade) {
		this.pkIdCidade = pkIdCidade;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "fk_id_estado", nullable = false)
	public GerTbEstado getGerTbEstado() {
		return this.gerTbEstado;
	}

	public void setGerTbEstado(GerTbEstado gerTbEstado) {
		this.gerTbEstado = gerTbEstado;
	}

	@Column(name = "cd_ibge", unique = true, nullable = true, columnDefinition = "character(7)")
	public String getCdIbge() {
		return this.cdIbge;
	}

	public void setCdIbge(String cdIbge) {
		this.cdIbge = cdIbge;
	}

	@Column(name = "nm_cidade", nullable = false, length = 70)
	public String getNmCidade() {
		return this.nmCidade;
	}

	public void setNmCidade(String nmCidade) {
		this.nmCidade = nmCidade;
	}

	@Column(name = "fl_removido", nullable = false, columnDefinition = "geral.flag DEFAULT '0'") @Type(type = "flagEnum")
	public Flag getFlRemovido() {
		return this.flRemovido;
	}

	public void setFlRemovido(Flag flRemovido) {
		this.flRemovido = flRemovido;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "gerTbCidade")
	public Set<CliTbEmpreendimento> getCliTbEmpreendimentos() {
		return this.cliTbEmpreendimentos;
	}

	public void setCliTbEmpreendimentos(
			Set<CliTbEmpreendimento> cliTbEmpreendimentos) {
		this.cliTbEmpreendimentos = cliTbEmpreendimentos;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "gerTbCidade")
	public Set<GerTbPessoa> getGerTbPessoas() {
		return this.gerTbPessoas;
	}

	public void setGerTbPessoas(Set<GerTbPessoa> gerTbPessoas) {
		this.gerTbPessoas = gerTbPessoas;
	}
	
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((pkIdCidade == null) ? 0 : pkIdCidade.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;
		GerTbCidade other = (GerTbCidade) obj;
		if (pkIdCidade == null) {
			if (other.pkIdCidade != null)
				return false;
		} else if (!pkIdCidade.equals(other.pkIdCidade))
			return false;
		return true;
	}
}

Converter da Classe:

@FacesConverter(forClass = GerTbCidade.class)
public class GerTbCidadeConverter implements Converter{
	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String valor) {
		if(valor==null)
			return null;
		
		try{
			GerTbCidadeDAO dao = new GerTbCidadeDAO(JpaUtil.getEntityManager());
			return dao.busca(Integer.parseInt(valor));
		}catch(Exception e){
			return "";
		}
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object obj) {
		if(obj==null)
			return null;
		
		try{
			GerTbCidade o = (GerTbCidade) obj;
			return "" + o.getPkIdCidade();
		}catch(Exception e){
			return "";
		}
		
	}
}

Cabeçalho da minha página:

<?xml version="1.0" encoding="UTF-8"?>

selectOneMenu:

<h:outputLabel value="Cidade: " for="fk_id_cidade">
									<em>*</em>
								</h:outputLabel>
								<p:selectOneMenu id="fk_id_cidade"
									value="#{gerTbPessoaControle.gerTbPessoa.gerTbCidade}"
									required="true" requiredMessage="#{msgs.msgCampoObrigatorio}">
									<f:selectItem itemLabel="#{msgs.lbSelecioneOpacao}" />
									<f:selectItems value="#{gerTbPessoaControle.selectItemCidadeByEstado}" />
									<f:converter converterId="gerTbCidadeConverter" />
								</p:selectOneMenu>
								<p:message for="fk_id_cidade" />
								<br />

Só repetindo que para algumas cidades ele cadastra/atualiza na boa e para outros dá erro de validação.
Já conferi no banco, tá td cadastrado certo, já tentei ver se segue alguma lógica a questão das cidades que dão certo e as que não dão certo, mas não existe um padrão.
Pensei que pudesse ser alguma coisa relacionada a carater especial mas não é pois ele funfa numa boa algumas cidades com caracter especial, enfim… Parece coisa do além, ou claro, pode ser a mais pura ignorância minha! :smiley:

10 Respostas

L

Posta o erro de dá…

N

Não gera exceção, não dá erro nenhum…

A única coisa q dá, é uma mensagem no meu p:message que diz o seguinte: fk_id_cidade: Erro de validação: o valor não é válido
Apenas isso…

L

Então voce está informando um código de cidade que não existe…certamente vc está carregando o código da cidade na sua listagem errado ou na hora de cadastrar, vc seleciona o municipio e manda um outro campo que não seja o código do municipio

D

Eu tive um problema desse com o ManyCheckbox, porem acabei desistindo de tentar solucionar e usei outro componente deles.
Porem estou curioso para saber se existe solução para isso.

N

Cara, não tem como estar enviando um código de cidade errado, pois tudo vem do banco, não tem nada estático.
Eu até mudei o nome do município no banco para ver se na tela ia aparecer o nome antigo ou o novo, e aparece o novo, isso prova que a informação vem sim do banco quando ele faz a consulta pra poder gerar o SelectItem.

E eu não estou passando outro componente porque quando eu seleciono um município dá certo e quando seleciono outro dá erro. Se eu tivesse passando um outro componente ou algo do tipo, era para dar erro sempre!

N

Galera, parece coisa do além, mas debugando vi que sempre que o objeto era para ser “Rio Branco” ele assume o valor null.
Debugando no eclipse, a cada cidade que ele vai debugando, todas assumem seu valor bunitinho, mas na hora de ser a cidade de Rio Branco dá merda…
Já dei um search pelo projeto para ver se tem alguma coisa “travando” no nome Rio Branco ou o id 4143 q é o ID dele, mas não tem…

N

Já apaguei o cadastro e cadastrei novamente, já mudei o nome, eu já não sei mais o q fazer…
Já mudei o id da cidade e continuou dando erro…
Fiz a troca de id entre duas cidades e a q deu erro foi a que ficou com o ID da dá erro…

Não sei se tem alguma coisa haver, mas uso postgres 9

N

Só uma correção, quando eu fiz a permuta de ID, o erro continuou com a cidade de Rio Branco.
Ex.:
Antes da Permuta:
id: 4143
cidade: Rio Branco
id: 4212
cidade: Rodrigues Alves
Erro dá em Rio Branco (4143)

Depois da Permuta:
id: 4212
cidade: Rio Branco
id: 4143
cidade: Rodrigues Alves
Erro dá em Rio Branco (4212)

N

Descobri qual o erro, mas ainda não consegui solucionar…
O que acontece é que sempre que eu tento atualizar a cidade de uma pessoa, para a mesma cidade do usuário corrente dá o erro de “o valor não é válido”.
Foi só eu mudar a cidade do meu cadastro que funfou numa boa para Rio Branco e começou a dar pau na minha nova cidade…

O curioso é que eu não jogo o usuário todo para a sessão, jogo apenas o id do usuário, id do perfil e id do sistema em um objeto “próprio” para isso, e só recupero o usuário logado nos métodos em q preciso, q neste caso em específico, não estou recuperando… (pelo menos eu acho…)

N

Galera, minha solução não foi das mais elegantes, mas consegui resolver…
Adicionei o seguinte trecho de código nas primeiras linhas do método equals

try{
			GerTbPessoa gerTbPessoa = new GerTbPessoaDAO(JpaUtil.getEntityManager()).busca(Integer.parseInt(Seguranca.getUsuarioLogado().getIdUsuario()));
			int id = gerTbPessoa.getGerTbCidade().getPkIdCidade();
			if(pkIdCidade == id && getClass() != obj.getClass())
				return true;
		}catch(Exception e){
			// :D
		}
Criado 28 de março de 2012
Ultima resposta 29 de mar. de 2012
Respostas 10
Participantes 3