En el anterior dos hemos visto cómo empezar con Spring Data Couchbase. Ahora es el momento de ser un poco más sofisticado (teniendo en cuenta que sofisticado o avanzado no significa más complicado). Echemos un vistazo a algunas de las grandes cosas que puedes hacer como el almacenamiento en caché, la validación de documentos y la exposición de tu repositorio a través de una API REST.
Almacenamiento en caché
El módulo básico de Spring proporciona un abstracción de caché con soporte para JSR-107(JCache). Veamos un ejemplo. Para asegurarme de que el resultado de un método se almacena en caché, puedo utilizar simplemente la siguiente anotación:
|
1 2 3 4 5 |
@Cacheable(value = “myCache”, key = “‘cache:’+#param”) public Object useALotOfCPUCycles(String param){ ….
} |
Aquí "myCache" es el nombre de una instancia de caché existente que he configurado. La clave del documento se resolverá utilizando la clave regex "'cache:'+#param", donde #param es el parámetro del método llamado 'param'. Esto asegurará que para el mismo parámetro, el método se ejecute sólo una vez. Cuando se llame en el futuro, el resultado se obtendrá de la caché. Es decir, de Couchbase si he configurado mi aplicación adecuadamente. Para definir una instancia de caché, añade lo siguiente a tu configuración:
|
1 2 3 4 5 6 7 |
@Bean
CouchbaseCacheManager cacheManager(CouchbaseClient couchbaseClient) throws Exception {
HashMap<String, CouchbaseClient> instances = new HashMap<>();
instances.put(“myCache”, couchbaseClient);
return new CouchbaseCacheManager(instances);
} |
y el @HabilitarCaché en su clase de configuración.
Si ya estás usando el sistema de caché de Spring, es realmente fácil reemplazar tu almacenamiento actual con Couchbase. Sólo asegúrate de que el cacheManager que estás usando es una implementación de CouchbaseCacheManager.
Validación de documentos
La validación de campos es una tarea común cuando se trabaja con objetos de negocio. Un ejemplo sería asegurarse de que un campo especificado no es nulo antes de almacenarlo en Couchbase, o que un campo no tiene más de 140 caracteres. Y la buena noticia es que esto es bastante fácil. Puedo usar la validación de Hibernate. Lo primero que hay que hacer es añadir la dependencia necesaria a mi pom:
|
1 2 3 4 5 |
org.hibernate hibernate-validator |
El siguiente paso es añadir un bean ValidationListener que lanzará una ConstraintViolationException cuando el objeto a almacenar no cumpla el requisito de validación:
|
1 2 3 4 |
@Bean
LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
} |
@Bean ValidatingCouchbaseEventListener validationEventListener() { return new ValidatingCouchbaseEventListener(validator()); }
Ahora que la configuración obligatoria está hecha, puedo añadir cualquier anotación de validación de Hibernate a mi objeto POJO así:
|
1 2 3 |
@Field @NotNull private String thisFieldShouldNotBeNull; |
Ahora cada vez que mi aplicación intenta guardar un objeto donde esta propiedad en particular se establece en null obtendré una ConstraintViolationException.
Por supuesto, hay muchas otras anotaciones aparte de @NotNull. Puede encontrarlas en la sección Documentación de primavera.
Exponer el repositorio con una API REST
Tener un repositorio disponible en tan poco tiempo es genial, pero lo que es aún mejor es el hecho de que puedes exponerlo detrás de una API REST simplemente añadiendo una dependencia. Esto requiere el uso de spring-data-rest-webmvc. Así que lo añado a mis dependencias así:
|
1 2 3 4 5 |
org.springframework.data spring-data-rest-webmvc |
Y voilà (me siento con derecho a escribir voila, ya sabes, por mi origen francés). Todos los objetos de este repositorio están expuestos HATEOAS estilo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
caolila:~ ldoguin$ curl -v https://localhost:8080/twitterUpdates { “_embedded” : { “twitterUpdates” : [ { “createdAt” : 1421929099417, “type” : “twitterUpdate”, “account” : “Couchbase”, “followers” : 90323, “favorites” : 619, “friends” : 541, “statuses” : 6155, “_links” : { “self” : { “href” : “https://localhost:8080/twitterUpdates/tw-couchbase–1421929099417” } } }, { “createdAt” : 1422314903175, “type” : “twitterUpdate”, “account” : “Couchbase”, “followers” : 90285, “favorites” : 619, “friends” : 542, “statuses” : 6207, “_links” : { “self” : { “href” : “https://localhost:8080/twitterUpdates/tw-Couchbase–1422314903175” } } } ] } |
Simplemente no olvides añadir getters como hice yo si quieres ver algunas propiedades en tus documentos JSON...
Eso es todo para esta serie de entradas de blog sobre Spring Data Couchbase. Por favor comenta y comparte, dinos si quieres más recursos de Spring y Couchbase, dinos si lo usas o quieres usarlo.
¿Tienes el enlace a tu código fuente para este proyecto? Estoy teniendo algunos problemas para conseguir la dependencia Spring-data-rest-webmvc para exponer mi repositorio