--- 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. ##Trabalhando com datas e calendários `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 estão disponíveis usando o plugin vraptor-jodatime. Mais informações [aqui](/pt/dependencias-e-pre-requisitos). Se você está usando JDK 8, você pode tirar proveito dos conversores do pacote `java.time`, que estão disponíveis usando o plugin vraptor-javatime. Mais informações [aqui](/pt/dependencias-e-pre-requisitos). ##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 ~~~ Ou vocẽ pode iniciar o servidor de aplicações ou servlet container com o parâmetro `-Duser.language=pt -Duser.region=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 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 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 } } ~~~