---
title: Conversores
---
# Quando usar um Conversor?
Sempre que um parâmetro é recebido, é necessário ter um conversor. O VRaptor já possui registrado conversores para todos os tipos definidos na `Java Language Specification`. Para os tipos primitivos, caso o parâmetro seja recebido como `null`, será retornado o valor padrão do campo. Por exemplo, se você receber um `int` cujo valor seja `null`, o converter irá retornar `0`. Já para os tipos objetos, se o parâmetro recebido for `null` ou vazio, o valor retornado será `null`.
##BigDecimal, Double e Float localizados
São suportados utilizando o padrão de localização da sua aplicação. `Double` e `Float` são suportados tanto o tipo primitivo quanto o tipo objeto.
##Calendar, Date e Joda-time
`Calendar` e `Date` são suportados por padrão usando a localização da sua aplicação.
Existem conversores para os principais tipos do Joda-time como `DateTime`, `LocalDate`, `LocalDateTime` e `LocalTime`. Os conversores do Joda-time são ativados automaticamente se você tiver o joda-time no classpath.
##Definindo a localização (Locale) da aplicação
A localização dos componentes pode ser alterada utilizando a seguinte configuração no web.xml:
~~~
#!xml
javax.servlet.jsp.jstl.fmt.locale
pt_BR
~~~
##Criando seu próprio converter
Todos os conversores devem implementar a interface `Converter` do vraptor. A classe concreta definirá o tipo que ela é capaz de converter e será invocada com o valor do parâmetro do request e o tipo alvo.
~~~
#!java
public interface Converter {
T convert(String value, Class extends T> type);
}
~~~
Além disso, seu conversor deve ser anotado com o tipo que seu conversor é capaz de converter, para isso utilize a anotação `@Convert`:
~~~
#!java
@Convert(Long.class)
public class LongConverter implements Converter {
// ...
}
~~~
Por fim, lembre-se de dizer se seu conversor pode ser instanciado em um escopo de `Application`, `Session` ou `Request`, assim como recursos e componentes quaisquer do VRaptor. Por exemplo, um conversor que não requer nenhuma informação do usuário logado pode ser registrado no escopo de `Application` e instanciado uma única vez:
~~~
#!java
@Convert(Long.class)
@ApplicationScoped
public class LongConverter implements Converter {
// ...
}
~~~
A seguir, a implementação de `LongConverter` mostra como tudo isso pode ser utilizado de maneira bem simples:
~~~
#!java
@Convert(Long.class)
@ApplicationScoped
public class LongConverter implements Converter {
public Long convert(String value, Class extends Long> type) {
if (isNullOrEmpty(value)) {
return null;
}
try {
return Long.valueOf(value);
} catch (NumberFormatException e) {
throw new ConversionException(new ConversionMessage("is_not_a_valid_integer", value));
}
}
}
~~~
##Sobrescrevendo o comportamento dos conversores existentes
Você pode sobrescrever qualquer converter já existente no VRaptor. Para isso basta estender a classe anotando-a com `@Specializes`. Um bom exemplo para isso é sobrescrever o conversor `LocaleBasedBigDecimalConverter` para alterar o formato do valor.
~~~
#!java
@Specializes
public class MeuBigDecimalConverter extends LocaleBasedBigDecimalConverter {
protected NumberFormat getNumberFormat() {
// meu formato
}
}
~~~