core.convert
que proporciona una manera de conversión de tipo genérica. Define un SPI (Service Provider Interface) para implementar la lógica de conversión de tipos, así como una API para ejecutar conversiones de tipo en tiempo de ejecución. Esta manera es una alternativa a PropertyEditors que se encarga de convertir las propiedades a los tipos requeridos.
Uso
El API pública también se puede utilizar en cualquier lugar de su aplicación donde se necesite la conversión de tipo. En el caso de contar con la dependencia de spring web, simplemente se tiene que inyectar el bean ConversionService
y utilizar el metodo convert
@Autowired private ConversionService conversionService; Listlist = conversionService.convert("Deb, Mike, Kim", List.class);
Si el bean no esta definido, se tiene que definir en una clase de configuración de la siguiente manera
@Bean public ConversionService conversionService() { DefaultConversionService service = new DefaultConversionService(); return service; }
El DefaultConversionService
por defecto posee una serie de conversores de uso frecuente
@Autowired private ConversionService conversionService; @Test public void convert_Strings_retornaLista() { Listlist = conversionService.convert("Deb, Mike, Kim", List.class); assertThat(list.size()).isEqualTo(3); } @Test public void convert_String_retornaBigDecimal() { BigDecimal monto = conversionService.convert("10.333", BigDecimal.class); assertThat(monto.toString()).isEqualTo("10.333"); } @Test public void convert_String_retornaCurrency() { Currency currency = conversionService.convert("ARS", Currency.class); assertThat(currency.getDisplayName()).isEqualTo("peso argentino"); } @Test public void convert_String_retornaOptional() { Optional optional = conversionService.convert("Algo", Optional.class); assertThat(optional.isPresent()).isTrue(); }
Conversores propios
Para crear nuestro propio conversor solo hay que implementar la interfaz Converter
y agregar el conversor al ConversionService
public class DateToLocalDateTime implements Converter { @Override public LocalDateTime convert(Date source) { return LocalDateTime.ofInstant(source.toInstant(),ZoneId.systemDefault()); } }
@Bean public ConversionService conversionService() { DefaultConversionService service = new DefaultConversionService(); service.addConverter(new DateToLocalDateTime()); return service; }
y luego utilizarlo de manera transparente
@Test public void convert_Date_retornaLocalDateTime() { LocalDateTime localeDate = conversionService.convert(new Date(), LocalDateTime.class); assertThat(localeDate).isInstanceOf(LocalDateTime.class); }
Para ver más en detalle pueden clonar el proyecto demo
Conclusión
De esta manera Spring nos propone un estándar para realizar las conversiones de tipos en nuestras aplicaciones. En nuestro código se vera claramente la responsabilidad de nuestros objetos y se evitara la duplicidad de código