En Spring 3 se introduce el paquete 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;
    
List list = 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() {
	List list = 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

Mandanos tus sugerencias

Ayudanos con ideas para los artículos de este blog a contacto@somospnt.com