domingo, 20 de septiembre de 2015

Proyecto myApiRest en GitHub con Eclipse

Vamos a subir un proyecto simple a GitHub con una API Rest muy básica, que tenga un interceptor y Spring MVC

Utilizamos
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:


  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.


  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 spring

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:
    
        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:


Vamos a mencionar un par de componentes Java: Observemos el  @ResponseBody para convertir las respuestas a JSON

   

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  Collection select() {
  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?



0 comentarios:

Publicar un comentario