¿Querés crear una Api desde tu entidad automáticamente sin código boilerplate? Este módulo de Spring tiene tu respuesta!

Spring Boot ofrece un fantástico soporte para acceder a los datos con JPA a través de sus interfaces, del tipo Repository. Si a esto le añadimos la facilidad con que se crean servicios REST, podremos hacer una aplicación ofreciendo una API para acceder a nuestros datos muy fácilmente.

Pero si queremos implementar HATEOAS (Hypermedia as the Engine of Application State) en nuestro proyecto o si hay muchos criterios sobre los que debemos acceder a los datos, deberemos escribir bastante código. Y mas cantidad de código, implica mayor esfuerzo en el mantenimiento de nuestra aplicación. Para solucionar este problema Spring Boot provee el paquete Spring Data Rest con el cual con pocas lineas podremos crear una API para acceder a las tablas de nuestra base de datos.

Lo primero que necesitamos en agregar la dependecia en el pom.xml

<dependency>     
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

Con esta dependecia ya podemos utilizar la propertie para configurar la ruta donde quedara expuesta el api:

spring.data.rest.base-path=/api
 
Luego, en el repositorio que queremos que este expuesto por el api, ponemos la siguiente anotacion:
 
@RepositoryRestResource(path = "customers", collectionResourceRel = "customers")
 
Gracias a esta anotacion, Spring Data Rest puede exponer nuestro repositorio con metodos REST y nos permite acceder a las acciones default del CrudRepository como findAll, findById, save, delete, y tambien a las busquedas custom creadas por nosotros, como por ejemplo "findByNombre".
 
El parametro path es como se va a llamar el path del recurso, en este caso seria /api/customers, y el parametro collectionResourceRel indica como se va a llamar la propiedad del JSON en el que venga la lista de nuestra entidad, en este caso "customers".
Por ejemplo, si para crear un nuevo cliente, hacemos un POST:
 
> curl -s --request POST localhost:8080/api/customer -d '{"id": 1, "name":"nombre cliente 1","address":"direccion cliente 1","telephone":"telefono cliente 1", "secret": "no guardar"}' -H "Content-Type: application/json"
{
   "name":"nombre cliente 1",
   "address":"direccion cliente 1",
   "telephone":"telefono cliente 1",
   "city":null,
   "_links":{
      "self":{
         "href":"http://localhost:8080/api/customer/1"
      },
      "customerEntity":{
         "href":"http://localhost:8080/api/customer/1"
      }
   }
}
 
Como ven, nos retorna el cliente creado.
Si queremos ver la lista de clientes, hacemos un GET:
 
> curl -s localhost:8080/api/customer
{
   "_embedded":{
      "customers":[
         {
            "name":"nombre cliente 1",
            "address":"direccion cliente 1",
            "telephone":"telefono cliente 1",
            "city":{
               "name":"Logroño",
               "province":"La Rioja"
            },
            "_links":{
               "self":{
                  "href":"http://localhost:8080/api/customer/1"
               },
               "customerEntity":{
                  "href":"http://localhost:8080/api/customer/1"
               }
            }
         }
      ]
   },
   "_links":{
      "self":{
         "href":"http://localhost:8080/api/customer"
      },
      "profile":{
         "href":"http://localhost:8080/api/profile/customer"
      },
      "search":{
         "href":"http://localhost:8080/api/customer/search"
      }
   }
}​

 
Y si hacemos un Get a un recurso en particular con su id:
 
> curl -s localhost:8080/api/customer/1
{
   "name":"nombre cliente 1",
   "address":"direccion cliente 1",
   "telephone":"telefono cliente 1",
   "city":{
      "name":"Logroño",
      "province":"La Rioja"
   },
   "_links":{
      "self":{
         "href":"http://localhost:8080/api/customer/1"
      },
      "customerEntity":{
         "href":"http://localhost:8080/api/customer/1"
      }
   }
}​
 
Por ejemplo, haciendo uso de un findBy custom:
 
> curl -s http://localhost:8080/api/customer/search/findByNameIgnoreCaseContaining?name=Clien
{
   "_embedded":{
      "customers":[
         {
            "name":"nombre cliente 1",
            "address":"direccion cliente 1",
            "telephone":"telefono cliente 1",
            "city":{
               "name":"Logroño",
               "province":"La Rioja"
            },
            "_links":{
               "self":{
                  "href":"http://localhost:8080/api/customer/1"
               },
               "customerEntity":{
                  "href":"http://localhost:8080/api/customer/1"
               }
            }
         }
      ]
   },
   "_links":{
      "self":{
         "href":"http://localhost:8080/api/customer/search/findByNameIgnoreCaseContaining?name=Clien"
      }
   }
}​
 

Mandanos tus sugerencias

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

¡Seguínos en nuestras redes sociales para enterarte de los últimos posts!