Ejemplo de Web Service REST con Spring MVC en un entorno Spring Boot

Sep 30, 2016 1 Comment by

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.

  • GET /pets : Listará todas las mascotas
  • GET /pets/{id} : Devuelve la información de una mascota por su id.
  • 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.

    Application running in console STS
    GET /pets
    Results GET /pets

    GET /pets/1
    Results GET /pets/1

    GET /pets/5 (exception)
    Results GET /pets/5 with 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.

    Java

    About the author

    Ingeniero en Informática, Oracle Certified Master Java EE 6 Enterprise Architect, Oracle Certified Professional Java Programmer. Experto en distintas ramas de la computación y otras "yerbas" xD. Si te gusto este post, sígueme en @deerme_org, escríbeme a info AT deerme.org o contactame por linkedin.

    One Response to “Ejemplo de Web Service REST con Spring MVC en un entorno Spring Boot”

    1. Juan Carlos says:

      Hola, ¿Como podria ejecutar el servicio en un servidor de aplicaciones como glassfish?

    Leave a Reply to Juan Carlos

    Cancel Reply


    seven + = 15