Problemas com id e validação no JSF

10 respostas
andre_a_s

Senhores :smiley:
Tenho um form com um campo que só deve aceitar numeros inteiros. Caso eu coloque um string, ele me manda a mensagem:

Erro de conversão "_id12": O valor especificado não é um número válido.

Tudo bem, ele mandou corretamente, mas apareceu o campo como: “_id12”. Se eu colocar o id da inputText como “numero” ele aparece:

Erro de conversão "numero": O valor especificado não é um número válido.

Ok, o que eu queria era que o id que eu coloquei, viesse de um arquivo de properties, porém se eu colocar assim:

<h:inputText size="60" rendered="true" value="#{ImovelBean.numero}" id="#{bundle.numero}"/>

Ele não funciona!!! Me parece que o JSF não dá suporte para o ID vir de um bundle.
Alguem sabe como resolver isso, ou alguma outra solução?
Abraços!

10 Respostas

zetamayossi

Ai… como que voce quer que esse ID venha de um properties?!
Ele não é dinamico?!?!

Tente criar converters…

andre_a_s:
Senhores
Tenho um form com um campo que só deve aceitar numeros inteiros. Caso eu coloque um string, ele me manda a mensagem:
Code:

Erro de conversão “_id12”: O valor especificado não é um número válido.

Tudo bem, ele mandou corretamente, mas apareceu o campo como: “_id12”. Se eu colocar o id da inputText como “numero” ele aparece:
Code:

Erro de conversão “numero”: O valor especificado não é um número válido.

Até onde eu sei… JSF instancia objetos do tipo Date, String, Integer…
Ainda não entendi como que vc fez esse form… posta ai o codigo inteiro… pq ai da pra ajudar mais…

Vlw

andre_a_s

Não é dinamico nao.
Ele só é dinamico se vcnão citar nenhuma.
Se vc colocar “id=‘lalala’”, ele poe oq vc colocou

zetamayossi

mesmo assim ainda nao entendi pq q vc quer q ele venha de um properties…

mas de qualquer forma… entendi qual id que vc tah falando… achei q era otro…

ids de componentes nao devem começar com numeros… e tem q ser String…
agora num sei se funciona vindo de um MBean…

imagino que sim… mas nunca fiz isto… apenas pra outras propriedades como por exemplo ‘disabled’ ou ‘readonly’… dai eu sei que funciona…

andre_a_s

Eu queria fazer issoi pra na mensagem de validação, aparecer o nome certinho do componente

D

crie um arquivo .properties (messageJSF.properties) e defina o no web.xml assim:

<application>
<message-bundle>mensagem.messageJSF</message-bundle>
</application>

neste arquivo vc precisa do id q o jsf utilza. aqui vai algumas

javax.faces.component.UIInput.CONVERSION=O valor informado n\u00EF\u00BF\u00BDo \u00EF\u00BF\u00BD v\u00EF\u00BF\u00BDlido.

javax.faces.component.UIInput.REQUIRED=Campo de preenchimento obrigat\u00EF\u00BF\u00BDrio!

javax.faces.convert.DateTimeConverter.CONVERSION=Data inv\u00EF\u00BF\u00BDlida.

javax.faces.convert.IntegerConverter.CONVERSION=O valor especificado n\u00EF\u00BF\u00BDo \u00EF\u00BF\u00BD um n\u00EF\u00BF\u00BDmero v\u00EF\u00BF\u00BDlido.

javax.faces.convert.BigDecimalConverter.CONVERSION=O valor especificado n\u00EF\u00BF\u00BDo \u00EF\u00BF\u00BD um n\u00EF\u00BF\u00BDmero v\u00EF\u00BF\u00BDlido.

DESSA FORMA VC IRA ALTERAR AS MENSAGENS PADROES DO JSF.

andre_a_s

Sim sim, isso eu já fiz, já estou usando minhas próprias mensagens, o problema eh que o nome do campo q ele mostra na mensagem é o ID, e isso eu não consigo colocar em um properties.

Ferryman

Olha, eu fiz um esquema aqui para setar minhas mensagens dinamicamente via código, mas só serve para conversão e validação… vou postar o código aqui e vc dá uma avalida.

Basicamente eu criei o meu Validator (tambem funciona para converter) no método validate dele eu Instancio o validador Padrao do jsf que eu preciso e chamo o método validade.
O método validate padrão do jsf lança exceção de validação então eu deixei a chamada do método dentro de Try/catch e quando ele lança uma exceção de validação eu faço um throws new ValidateException mandando a mensagem que eu quiser que seja exibida na tela.

Funcionou muito bem, ai vai o codigo

package com.joinquestionnaire;

import java.util.*;

import javax.faces.application.FacesMessage;
import javax.faces.component.*;
import javax.faces.context.FacesContext;
import javax.faces.validator.*;

/**
 * Essa classe é um validador de tamanho de Strings, e foi implementado para possibilitar a customização
 * das mensagens de validação.
 * A responsabilidade de setar a mensagem corretamente é do usuario desta classe, que deve setar corretamente a
 * mensagem nos casos de valor minimo, maximo ou um intervalo.
 * @author Rafael Farias Silva
 */
public class LengthValidatorDecorator implements Validator, StateHolder {
	/** A mensagem de erro que será exibida quando ocorrer um erro de validação*/
	private String mensagemErro = null;
	/** a menor data que poderá ser inserida */
	private int minimo;
	/** a maior data que poderá ser inserida */
	private int maximo;
	private boolean _transient = false;

	/** Construtor
	 *
	 */
	public LengthValidatorDecorator() {
		}

	public void validate(FacesContext context, UIComponent component, Object value) {

		LengthValidator validator = new LengthValidator(maximo, minimo);
			try {
			validator.validate(context, component, value);
			} catch (ValidatorException ve){
				throw new ValidatorException(new FacesMessage(mensagemErro));
			}

	}

	public String getMensagemErro() {
		return mensagemErro;
	}


	public void setMensagemErro(String mensagemErro) {
		this.mensagemErro = mensagemErro;
	}




	public boolean isTransient() {

		return _transient;
	}


	public void restoreState(FacesContext context, Object state) {
	  Object values[] = (Object[])state;
    minimo = (Integer)values[0];
    maximo = (Integer)values[1];
    mensagemErro = (String) values[2];

	}


	public Object saveState(FacesContext context) {
	  Object values[] = new Object[3];
    values[0] = minimo;
    values[1] = maximo;
    values[2] = mensagemErro;

    return values;
	}


	public void setTransient(boolean newTransientValue) {
		this._transient = newTransientValue;
	}

	public int getMaximo() {
		return maximo;
	}

	public void setMaximo(int maximo) {
		this.maximo = maximo;
	}

	public int getMinimo() {
		return minimo;
	}

	public void setMinimo(int minimo) {
		this.minimo = minimo;
	}

	public boolean is_transient() {
		return _transient;
	}

	public void set_transient(boolean _transient) {
		this._transient = _transient;
	}

}
gilliard_santos

Olá André, tem um artigo meu na MundoJava desse mês e tem uma parte lá que parece até que eu escrevi depois de ler esse teu problema :smiley:
Realmente esse negócio de mensagem é meio chatinho, e muitas vezes você tem que dar voltas as vezes até grandinhas pra conseguir o que quer. Pensando nessas coisinhas, o JSF 1.2 ficou muito bom, e tem um atributo label que você coloca no input e nele você especifica um texto, como poe exemplo “Data de nascimento” e em vez de usar o id, na hora de montar a mensagem o JSF usa esse label. Fora isso você pode especificar uma mensagem específica caso aconteça um erro da validação nesse input.
Se quiser, da uma olhada na edição da MJ desse mês que fala disso e de outras melhorias do JSF 1.2 lá.

Ah, e sobre colocar o id dinâmico (com EL), usando “JSF puro” não vai mesmo…

andre_a_s

Valeu giglliard, isso realmente rsolve meus problemas :slight_smile:
MAAASSSSS… eu to usando o MyEclipse 5.1, e ele nao ta usando o JSF 1.2, e sim o JSF 1.1.
Pra falar a verdade, eu nem escolhi a versão do JSF, eu escolhi só a versão do MyFaces 1.1.4.
Acha que tem como eu embutir a implementação do JSF 1.2 lá?

gilliard_santos

Tem sim, eu to usando só eclipse 3.2.1 e WTP, ou seja, suporte nenhum nem pro jsf 1.1, quanto mais pro 1.2.
Para voce usar o 1.2 vc só tem que mudar os jar e o cabeçalho do faces-config.xml para algo assim

&lt?xml version="1.0" encoding="UTF-8" ?&gt

&lt;faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xi="http://www.w3.org/2001/XInclude"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"&gt;

...

&lt;/faces-config&gt;

coisas desse tipo eu acabei nem colocando na revista pois o artigo já estava muito grande, e dei preferencia para coisas mais difíceis de encontrar pela net.
Qualquer coisa posta aí.
falow

Criado 8 de janeiro de 2007
Ultima resposta 18 de jan. de 2007
Respostas 10
Participantes 5