Vamos a subir un proyecto simple a GitHub con una API Rest muy básica, que tenga un interceptor y Spring MVC
Utilizamos
Utilizamos
- Eclipse MARS
- SourceTree GitHub
- Java 1.8
- Repositorio de GitHub java: https://github.com/PabloEzequiel/Java
- myApiRest.war
La versión inicial del myApiRest.war para los que quieran seguir el post, se encuentra en la siguiente dirección de dropbox:
La evolución del myApiRest.war la realizaremos en GitHub
Comencemos:
Tomamos el war de myApiRest.war y lo importamos en el eclipse, como un nuevo proyecto maven:
Además ejecutamos, run > maven install que nos trae las dependencias y complica el proyecto.
Observemos el pom.xml que contiene el plugin de Tomcat, con lo cual, vamos a ejecutar el war y realizar algunas invocaciones:
Observemos el pom.xml que contiene el plugin de Tomcat, con lo cual, vamos a ejecutar el war y realizar algunas invocaciones:
org.apache.tomcat.maven tomcat7-maven-plugin 2.2
Para probar el proyecto, agregamos una nueva configuración al eclipse, equivalente a:
mvm tomcat7:run
Lo cual nos permitirá consumir algunas URL del WAR, después de ejecutar el tomcat7:run que configuramos
Podemos hacer lo mismo para utilizar Jetty en vez del Tomcat.
Ok, con jetty levantado, también podemos invocar a las url anteriores.
http://localhost:8080/myApiRest/javaBookManager/
Observamos en el log, que el controlador responde, además que el interceptor también lo captura.
El error que muestra es recién en la respuesta, porque intentamos retornar una respuesta JSON y nos falta incluir a jackson al proyecto
Las dependencias a agregar al pom.xml son las siguientes:
Y vemos el resultado, donde se recupera el JSON, a su vez, en el log podemos ver al interceptor trabajando:
Vamos a mencionar un par de componentes Java: Observemos el @ResponseBody para convertir las respuestas a JSON
Con esto damos finalizado el ejercicio de un proyecto con Spring MVC para una hacer una API REST
Se deja el siguiente TAG en GitHub para el que le interese recuperar el estado de esta versión:
https://github.com/PabloEzequiel/Java/releases/tag/v1.0.1
mvm tomcat7:run
Lo cual nos permitirá consumir algunas URL del WAR, después de ejecutar el tomcat7:run que configuramos
Podemos hacer lo mismo para utilizar Jetty en vez del Tomcat.
org.eclipse.jetty jetty-maven-plugin 9.3.7.v20160115 10 /myApiRest 8080
Ok, con jetty levantado, también podemos invocar a las url anteriores.
En esta primera versión, tenemos el ejemplo funcionando, con spring MVC, un interceptor, y además está swagger incorporado al proyecto.
Probando el WAR
Invocamos a uno de los controladores de springhttp://localhost:8080/myApiRest/javaBookManager/
Observamos en el log, que el controlador responde, además que el interceptor también lo captura.
El error que muestra es recién en la respuesta, porque intentamos retornar una respuesta JSON y nos falta incluir a jackson al proyecto
Las dependencias a agregar al pom.xml son las siguientes:
com.fasterxml.jackson.core jackson-core 2.2.3 com.fasterxml.jackson.core jackson-databind 2.2.3 com.fasterxml.jackson.core jackson-annotations 2.2.3
Y vemos el resultado, donde se recupera el JSON, a su vez, en el log podemos ver al interceptor trabajando:
Clases Java - Controller y @ResponseBody
Si bien el ejercicio completo está en GitHub en:
package com.javaen.web; import java.util.Collection; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import com.javaen.business.BookManagerService; import com.javaen.domain.JavaBook; /** * @author [Pablo Ezequiel] * * REST API Book Manager * * - getAll * - {id} * - update (string, book) * - add() * * http://localhost:8080/myApiRest/javaBookManager/ * http://localhost:8080/myApiRest/javaBookManager/001 * * http://localhost:8080/myApiRest/swagger-ui/index.html */ @Controller @RequestMapping("/javaBookManager") public class BookManagerController { static final Logger LOG = LoggerFactory.getLogger(BookManagerController.class); @Autowired BookManagerService bookManagerService; @RequestMapping(value="/{id}",method=RequestMethod.GET) public @ResponseBody JavaBook get(@PathVariable String id) { LOG.debug("BookManagerController::get("+id+")"); JavaBook book = bookManagerService.get(id); LOG.debug("Book("+id+"): " + book); return book; } @RequestMapping(method=RequestMethod.GET) public @ResponseBody Collectionselect() { LOG.debug("BookManagerController::getAll()"); Collection books = bookManagerService.getAll(); LOG.debug("BookManagerController select(): " + books); return books; } @RequestMapping(value="/{id}",method=RequestMethod.PUT) @ResponseStatus(HttpStatus.NO_CONTENT) public void update(@PathVariable String id, @RequestBody JavaBook book) { LOG.debug("BookManagerController::update("+id+","+book+")"); book.setId(id); bookManagerService.update(id, book); } @RequestMapping(method=RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) public void add(@RequestBody JavaBook book, HttpServletResponse response) { LOG.debug("BookManagerController::add("+book+")"); bookManagerService.add(book); } }
Con esto damos finalizado el ejercicio de un proyecto con Spring MVC para una hacer una API REST
Se deja el siguiente TAG en GitHub para el que le interese recuperar el estado de esta versión:
https://github.com/PabloEzequiel/Java/releases/tag/v1.0.1
En un próximo post, el objetivo será que swagger levante la info de la API Rest para documentarla.
Un poco de Feedback
- ¿Pudieron hacer funcionar el ejemplo?