Si está en el espacio JEE y desea una capa de gestión de datos moderna para su Aplicaciones NoSqlpuede que te encuentres rápidamente limitado. Hay algunos proyectos interesantes como Hibernar OGM o Deltaspikepero ninguno de ellos soporta Couchbase y son tan avanzados como Spring Data.
Pero todo está bien porque los proyectos Spring Data tienen extensiones CDI. Lo que significa que puedes usarlos en contenedores JEE. Traer otro marco DI como Spring conlleva cierta sobrecarga ya que CDI ya está aquí, pero vale la pena la sobrecarga cuando se obtiene toda la bondad que viene de Spring Data.
Veamos cómo funciona. Utilizaré el ejemplo hibernate5 disponible en las guías rápidas de wildfly y reemplazaré Hibernate Core por Spring Data Couchbase. El código original se encuentra en aquí y código final migrado aquí.
Conexión a Couchbase con CDI
Lo primero que querrás configurar es una conexión a un cluster de Couchbase. Como estás usando CDI, puedes crear un @Producer. No voy a entrar en detalles sobre cómo puedes externalizar las propiedades de la dirección IP, el nombre del bucket, el login de administrador y la contraseña. Utilizaré los valores por defecto. Si no proporcionas ninguna dirección o nombre de bucket, el SDK asume que tienes Couchbase Server corriendo en localhost con un bucket llamado default.
|
1 2 3 4 5 6 7 8 |
@Produces public CouchbaseOperations createCouchbaseTemplate() throws UnknownHostException, CouchbaseException { CouchbaseCluster cluster = CouchbaseCluster.create(); Bucket bucket = cluster.openBucket(); ClusterInfo clusterInfo = cluster.clusterManager("default","").info(); return new CouchbaseTemplate(clusterInfo, bucket); } |
Esto debería darte todo lo que necesitas para tener repositorios Couchbase funcionando. Ten en cuenta que hay un error en la última versión de Soldar. Así que puedes tener problemas. Se puede encontrar una solución rápida aquí. Básicamente el problema es que Weld ha cambiado la forma de almacenar los calificadores, que ya no es compatible con el método de búsqueda Bean (basado en calificadores). Así que lo arreglé temporalmente cambiando la forma en que se procesan las anotaciones en la extensión CDI directamente. El código de ejemplo tiene este aspecto:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
void processBean(@Observes ProcessBean processBean) { Bean bean = processBean.getBean(); for (Type type : bean.getTypes()) { if (type instanceof Class<?> && CouchbaseOperations.class.isAssignableFrom((Class<?>) type)) { Set qualifiers = bean.getQualifiers().stream() .sorted((e1, e2) -> Integer.compare(e1.hashCode(), e2.hashCode())).collect(Collectors.toSet()); couchbaseOperationsMap.put(qualifiers, ((Bean) bean)); } } } |
Es muy probable que se encuentre con este error si utiliza Wildfly 10 o Jboss EAP 7.
Integrar el repositorio de Spring
Una vez que tengas tu productor para la clase CouchbaseOperations, puedes empezar a crear repositorios. No tienes que implementar nada, lo cual es parte de la belleza de Spring Data. Sólo tienes que crear una interfaz que extienda la clase CouchbasePagingAndSortingRepository especificando la clase de Entidad que desea gestionar así como el tipo de la clave. En el ejemplo es . Lo que significa que el repositorio almacena las entidades Members usando un Largo como llave.
Simplemente añadiré un método llamado findAll que toma un valor Ordenar como parámetro.
|
1 2 3 4 |
public interface MemberRepository extends CouchbasePagingAndSortingRepository { Iterable findAll(Sort sort); } |
Esto requiere un cambio en el MemberListProducer utilizar ese método concreto. A Ordenar le permite definir el objeto Ordenar así como los campos que se utilizarán para la dirección Ordenar.
|
1 2 3 4 5 |
@PostConstruct public void retrieveAllMembersOrderedByName() { members = memberRepository.findAll(new Sort(Sort.Direction.ASC, "name")); } |
Ahora deberías estar listo para desplegar ese proyecto en tu contenedor JEE. Si utilizas Wildfly y el código en este repositorio githubpuede ejecutar mvn wildfly:deploy y vaya a la siguiente URL: https://localhost:8080/wildfly-springdata.
Si tienes algún problema o sugerencia, háznoslo saber en la sección de comentarios.