Como podemos utilizar clases de configuración que nos provee Spring Framework para conseguir un código mas limpio y mantenible.
¿Que son las clases de configuracion?
Las clases de configuracion son clases marcadas con la annotation @Configuration que le indica a Spring que tiene la clase tiene Beans definidos dentro de ella, consiguiendo que Spring los registre y esten disponibles para utilizar dentro de nuestra aplicación
¿Como podría utilizarlas en mi proyecto?
Consideremos que siguiente caso, estamos desarrollando una aplicación para una obra social, nuestra aplicación no tiene acceso a base de datos, sino que realiza todas las operaciones que necesita mediante peticiones a una API. Hasta aquí nada fuera de lo usual ,el problema es que este servicio responde en formato XML y nosotros para manipular la informacion, necesitamos mapearla a una entidad de dominio.
Si necesitamos obtener la información de un paciente por ejemplo, nos comunicaremos con la APi haciendo algo similar a lo siguiente.
@Repository
public class PacienteRepository {
public Paciente buscarPaciente(Long id) {
String URI = BASE_URI + "/api/paciente/" + id;
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(getMessageConverters());
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<Paciente> response = restTemplate.exchange(URI, HttpMethod.GET, entity, Paciente.class);
Paciente paciente = response.getBody();
return paciente;
}
//Establecemos un mensaje converter para la response que obtengamos
private List<HttpMessageConverter<?>> getMessageConverters() {
XStreamMarshaller marshaller = new XStreamMarshaller();
MarshallingHttpMessageConverter marshallingConverter = new MarshallingHttpMessageConverter(marshaller);
List<HttpMessageConverter<?>> converters = ArrayList < HttpMessageConverter < ? >> ();
converters.add(marshallingConverter);
return converters;
}
}
Realizar este procedimiento engorroso una vez no seria un problema, pero probablemente no solo necesitemos la información del paciente, probablemente necesitemos información sobre médicos, hospitales, planes de la obra social, etc. ¿Como podríamos ahorrarnos este trabajo en cada uno de nuestros repositorios?
¡Llegan las clases de configuración a nuestro rescate !
Para solucionar esta molesta repetición de código, solo necesitaremos crear una clase a la que añadiremos la Annotation @Configuration para que Spring la tiene que considerarla a la hora de inicializar el contexto de nuestra aplicación. Una vez hecho esto crearemos un Bean de restTemplate con la configuración que sabemos que tendremos que repetir en cada repositorio.
@Configuration
public class RestConfig {
@Bean
public restTemplate restTemplate
public restTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(getMessageConverters());
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
HttpEntity<String> entity = new HttpEntity<String>(headers);
return restTemplate;
}
private List<HttpMessageConverter<?>> getMessageConverters() {
XStreamMarshaller marshaller = new XStreamMarshaller();
MarshallingHttpMessageConverter marshallingConverter = new MarshallingHttpMessageConverter(marshaller);
List<HttpMessageConverter<?>> converters = ArrayList < HttpMessageConverter < ? >> ();
converters.add(marshallingConverter);
return converters;
}
}
Y listo, hecho esto podremos regresar a nuestra PacienteRepository y el código queda reducido a unas pocas lineas, ahorrándonos así de la tarea de configurarlo cada vez que realicemos una consulta a la API.
public Class PacienteRepository {
@Autowired
private RestTemplate restTemplate;
public Paciente buscarPaciente(Long id) {
String URI = BASE_URI + "/api/paciente/" + id;
ResponseEntity<Paciente> response = restTemplate.exchange(URI, HttpMethod.GET, entity, Paciente.class);
Paciente paciente = response.getBody();
return paciente;
}
}
Conclusión
Si bien este solo es un ejemplo, sirve para darse una idea de como podemos utilizarlas para modificar aspectos de nuestra aplicación para darle el comportamiento que deseemos. Sin duda es una herramienta que nos ayudará en mas de un desarrollo.