Jsf+required true e converter personalizado funcionando juntos

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"/>