Ejemplo de Web Service REST con Spring MVC en un entorno Spring Boot
En el ecosistema de Java, existen muchas formas de implementar un servicio web de tipo REST, en esta oportunidad, implementaremos un pequeño ejemplo usando Spring, específicamente con Spring MVC y Spring Boot, esté último, para lograr un servicio web standalone. Usaremos el entorno de desarrollo Spring Tool Suite.
Para este ejemplo, implementaremos un pequeño servicio web RESTful que contiene dos operaciones, buscar todas las mascotas y buscar una mascota por su id. Para mantener el ejemplo acotado al servicio web, la capa de servicio a datos será un mockup, la cual puede ser reemplazada con un acceso a real a los datos (usando JDBC, JPA, Spring Data, etc.).
Procedemos a crear un nuevo proyecto con Spring Tool Suite, para los amigos, “STS” usando el wizard de generación “File -> New -> Spring Starter Project” como en la siguiente imagen.
A nuestro archivo pom.xml agregamos la referencia “spring-boot-starter-web” para que nos incluya Spring MVC. Guardamos y realizamos un mvn clean.
Creamos dos clases de dominio como simples POJO, llamadas “Pet” y “Animal”, las que contendrán solamente getters/setters para acceder a sus atributos.
// Animal.java package org.deerme.java.example.model; public class Animal { private String name; public Animal(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } // Pet.java package org.deerme.java.example.model; public class Pet { private int id; private String name; private Animal animal; public Pet() { super(); } public Pet(int id, String name, Animal animal) { super(); this.id = id; this.name = name; this.animal = animal; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Animal getAnimal() { return animal; } public void setAnimal(Animal animal) { this.animal = animal; } }
Ahora, necesitamos un Controlador que será el encargado de exponer las operaciones que deseamos implementar en nuestro Servicio Web, siguiendo los principios de la arquitectura REST, tendremos dos operaciones.
Solo debemos “adornar” nuestra clase con la anotación @RestController y cada método con la anotación @RequestMapping y dejamos que Spring MVC haga el trabajo por nosotros. Creamos una capa de Servicio que nos permite acceder a nuestras mascotas, llamada “PetService”, la cual en este ejemplo es solo un mokcup con datos hardcode (la que puedes re-escribir para acceder a datos reales usando JDBC, JPA, Spring Data,etc.) y llamamos a esos servicios, además, consideramos que nuestra capa de servicio podrá lanzar exceptiones de negocio (como por ejemplo, no existe la mascota con id 100). Nuestras clases podrían ser como las siguientes.
//PetController.class package org.deerme.java.example.controller; import java.util.List; import org.deerme.java.example.model.Pet; import org.deerme.java.example.service.PetService; import org.deerme.java.example.service.PetServiceException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class PetController { @Autowired PetService petService; @RequestMapping(value = "/pets", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) public List<Pet> findAll() { return petService.findAll(); } @RequestMapping(value = "/pets/{id}", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE }) public Pet findById(@PathVariable("id") int id) throws PetServiceException { return petService.findById(id); } } //PetService.java package org.deerme.java.example.service; import java.util.ArrayList; import java.util.List; import org.deerme.java.example.model.Animal; import org.deerme.java.example.model.Pet; import org.springframework.stereotype.Service; /** * PetService * * This layer contain the access to the pet's operation. This a example, all * data it's hardcode. * * @author 1066121 * */ @Service public class PetService { List<Pet> pets; public List<Pet> findAll() { if (pets == null) { pets = new ArrayList<Pet>(); pets.add(new Pet(1, "Cachupin", new Animal("Perro"))); pets.add(new Pet(2, "Tomas", new Animal("Gato"))); pets.add(new Pet(3, "Luis", new Animal("Loro"))); } return pets; } public Pet findById(int id) throws PetServiceException { for (Pet pet : findAll()) { if (pet.getId() == id) { return pet; } } throw new PetServiceException("Don't exits the pet with " + id + "key"); } }
Y procedemos a ejecutar nuestra apicación “Spring Boot”, para eso, lo debemos selecionar la opción “Run As -> Spring Boot App” y nuestra aplicación correrá de forma standalone. Ahora solo debemos realizar nuestras peticiones HTTP para ver como reacciona nuestro servicio web, usando cualquier browser o algún cliente REST como SOAPUI, Advanced Rest Client o Insomnia.
GET /pets
GET /pets/1
GET /pets/5 (exception)
Finalmente, este pequeño ejemplo, se encuentra en mi repositorio de github https://github.com/deerme/microservices-course/tree/master/ExWebServiceRest por si desean descargar el proyecto completo para STS o cualquier version reciente de Eclipse.
Hola, ¿Como podria ejecutar el servicio en un servidor de aplicaciones como glassfish?