Bom dia pessoal, estou fazendo um trabalho para pós, e surgiu a necessidade de fazer um Converter para um campo Double que esta com a validação “required true”,
no campo de entrada conforme o código da jsp abaixo, se não houver o converter funciona ok quando o usuário não preenche o campo a mensagem de campo requerido aparece normamelmente, porém quando coloco o “converter” para funcionar juntamente conforme o código da jsp abaixo, se o usuário não preencher o campo da um erro no converter e aparece a mensagem do converter ""Formato de número inválido no campo “+nomeComponente+”. conforme codigo abaixo do converter, não passando primeiramente pelo “required true”, ou seja, eu gostaria que primeiramente fosse feito a verificação de “required true” e se não passasse nesse teste a mensagem setada no “required true” fosse mostrada e não a do converter como está acontecendo, alguém tem alguma dica?
faces-config
<converter>
<converter-id>double2D</converter-id>
<converter-class>edu.web.jsf.converters.Double2DConverter</converter-class>
</converter>
converter
package edu.web.jsf.converters;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import java.util.regex.Pattern;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
public class Double2DConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
Double argumento = null;
String nomeComponente = (String)arg1.getAttributes().get("alt");
try {
/*
* Testa o valor de acordo com a expressão regular.
*/
String expressao = "\\d*(\\,\\d{2})?";
if (!Pattern.matches(expressao, arg2)) {
throw new Exception();
}
/*
* Cria o objeto localizado para o Português brasileiro
*/
Locale locale = new Locale("pt", "br");
/*
* Cria o decimal format Localizado
*/
DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale);
DecimalFormat decimalFormat = new DecimalFormat("#,###.##", symbols);
/*
* Retorna o número decimal formatado e na lingua portuguesa
*/
argumento = decimalFormat.parse(arg2).doubleValue();
} catch (Exception e) {
/*
* Valor informado é inválido
*/
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN,
"Formato de número inválido no campo "+nomeComponente+".",
"Formato de número inválido no campo "+nomeComponente+".");
throw new ConverterException(message);
}
return argumento;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
try {
/*
* Casting para Double
*/
Double argumento = (Double) arg2;
/*
* Cria o objeto localizado para o Português brasileiro
*/
Locale locale = new Locale("pt", "br");
/*
* Cria o decimal format Localizado
*/
DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale);
DecimalFormat decimalFormat = new DecimalFormat("#,###.##", symbols);
/*
* Retorna o número decimal formatado e na lingua portuguesa
*/
return decimalFormat.format(argumento);
} catch (Exception e) {
return null;
}
}
}
jsp
<h:outputLabel for="valor1" value="#{msgs.valor1}" />
<h:inputText alt="Valor 1" required="true" requiredMessage="Preencha o valor 1" id="valor1Id" value="#{CalculadoraBean.valor1}" converter="double2D"/>