[Resolvido] Problema com convertNumber

2 respostas
deise.vicky

Galera, estou com problemas na hora de usar o componente convertNumber.
Preciso validar um determinado campo sendo que este deve conter apenas números, nunca caracteres especiais.

Tenho o seguinte:

<h:inputText id="txCodigo" value="#{myMBean.pojo.codigo}" label="#{mes.codigo}" required="true" maxlength="20" style="width:200px;">
	<f:convertNumber integerOnly="true" />
</h:inputText>

O problema é o seguinte:
Se eu digitar *, exibe a mensagem “Valor **** não é um número”
mas se eu digitar 555
555, o conversor converte o valor para 555 e armazena na base de dados sem gerar nenhuma exceção.
Resumindo, ele sempre pega os números digitados à esquerda ignorando o restante do valor digitado.
Já tentei alterar a propriedade “pattern” para 9999, mas aí eu tenho que digitar 4 digítos para dar certo, porém, o usuário pode querer digitar apenas 1…

Alguém já teve esse tipo de problema? Sabe porque isso acontece? Seria um bug do componente?

2 Respostas

deise.vicky
deise.vicky:
Galera, estou com problemas na hora de usar o componente convertNumber. Preciso validar um determinado campo sendo que este deve conter apenas números, nunca caracteres especiais. Tenho o seguinte:
<h:inputText id="txCodigo" value="#{myMBean.pojo.codigo}" label="#{mes.codigo}" required="true" maxlength="20" style="width:200px;">
	<f:convertNumber integerOnly="true" />
</h:inputText>

O problema é o seguinte:
Se eu digitar ****, exibe a mensagem "Valor **** não é um número"
mas se eu digitar 555***555, o conversor converte o valor para 555 e armazena na base de dados sem gerar nenhuma exceção.
Resumindo, ele sempre pega os números digitados à esquerda ignorando o restante do valor digitado.
Já tentei alterar a propriedade "pattern" para 9999, mas aí eu tenho que digitar 4 digítos para dar certo, porém, o usuário pode querer digitar apenas 1...

Alguém já teve esse tipo de problema? Sabe porque isso acontece? Seria um bug do componente?

Bem, não consegui até agora consertar isso, porém, consegui fazer de uma outra forma: criar uma classe que faz a conversão do valor para Integer. Segue o código:
...

@FacesConverter(value = "integerConverter")
public class IntegerConverter implements Converter {
	
	@Override
	public Object getAsObject(FacesContext facesContext,
			UIComponent uiComponent, String value) {
		
		Integer result = null;
		
		try{
			result = new Integer(Integer.parseInt(value));
		}catch (Exception e) {
			throw new ConverterException(value + " não é um número.");
		}
		
		return result;
	}

	@Override
	public String getAsString(FacesContext facesContext,
			UIComponent uiComponent, Object value) {

		String result = "";
		
		if (value != null) {
			result = value.toString();
		}

		return result;
	}

}
O único problema disso é na mensagem de validação exibida para o usuário, não consigo configurá-la. Tenho um arquivo .properties onde tenho todas as mensagens de validação, está mais ou menos assim:
javax.faces.component.UIInput.CONVERSION={0}\: Ocorreu um erro de convers\u00E3o.
javax.faces.converter.NumberConverter.NUMBER={2}\: ''{0}'' não é um número.
...

E assim por diante.
Só que usando o converter com a classe de conversão que eu criei, a mensagem que aparece é a primeira do meu arquivo .properties, só que da seguinte forma:

{0}: Ocorreu um erro de conversão.

Sendo que no meu componente seto o 'label' para uma mensagem pré-definida que está em outro arquivo de configuração.
A mensagem deveria aparecer assim:

Código: '***' não é um número.

O valor do 'label' do é "Código", mas parece que depois da conversão esse valor não está sendo reconhecido.
Queria que após ocorrer um erro de validação aparecesse a segunda mensagem do meu arquivo.
Alguém sabe como configurar a mensagem do converter que eu criei? Poderia me dar uma dica?

deise.vicky

Enfim, consegui resolver de uma forma mais simples.
No componente fiz da seguinte forma:

<f:inputText converter="java.faces.Integer" />

Funcionou e resolver meu problema!

Fica aí a solução para quem precisar, lembrando que além do Integer tem também como converter para todos os outros tipos de dados do Java.

Criado 19 de julho de 2011
Ultima resposta 21 de jul. de 2011
Respostas 2
Participantes 1