GeoBack. Un sencillo ejemplo. 1ª Parte

En este post vamos a mostraros un ejemplo de uso de GeoBack. Simplemente, haremos un CRUD Controller con Spring Boot, el cual nos permitirá manipular capas como objetos de tipo Layer que contienen un documento GeoJson y una serie de metadatos.

Esta será nuestra clase Layer, que es un sencillo POJO (Plain Old Java Object) con alguna peculiaridad:

@Document(collection = "layers")
public class Layer extends AbstractDomainObject{

    private String token;
    private String name;
    private String series;
    private String description;
    private FeatureCollection geoData;

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSeries() {
        return series;
    }

    public void setSeries(String series) {
        this.series = series;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public FeatureCollection getGeoData() {
        return geoData;
    }

    public void setGeoData(FeatureCollection geoData) {
        this.geoData = geoData;
    }
}

Como vemos, al añadir la etiqueta @Document, diremos a Spring que se trata de una clase que representa el tipo de documento que almacenaremos en la base de datos. Cabe destacar, que en el atributo geoData se almacenan el GeoJson con los datos georeferenciados en un FeatureCollection.

Como queremos hacer las cosas un poco ordenadas,  usamos un patrón Service Layer. Con Spring Data necesitamos tres capas diferenciadas en el código:

  • La capa de modelo, que en este caso se completaría con un Spring Data Repository.
  • La capa de servicio, que utilizamos para dotar de mayor abstracción al sistema.
  • La capa de controller, que es donde aparece REST y nos dará la puerta de acceso de nuestra Api.

 

Capa de modelo.

Sólo necesitamos definir un interface que herede de MongoRepository.

public interface LayerCRUDRepository extends MongoRepository<Layer,String> 
{
// Aqui definiriamos los demas metodos.
}

Tenemos que indicar a los genéricos de MongoRepository, que nuestro documento a almacenar es de tipo Layer y que su Id es de tipo String. No hay que añadir ningún método a la clase, ya que estamos desarrollando un CRUD y nos sobra con los métodos definidos en la clase padre (MongoRepository).

Capa Servicio.

En el servicio definimos qué es lo que podemos hacer con nuestros Layer. De momento, sólo tenemos los 4 métodos del CRUD (crear, leer, actualizar y eliminar un Layer), pero podemos añadir otras, como por ejemplo buscar todos los Layer con un token determinado, o un listado de Layer de una serie determinada.

Consta de un interface:

public interface LayerCRUDService {

    // C
    Layer create(Layer layer);
    // R
    Layer read(String id);
    // U
    Layer update(Layer layer);
    // D
    void delete(String id);
}

y su implementación:

@Service
public class LayerCRUDServiceImpl implements LayerCRUDService{

    private LayerCRUDRepository layerCRUDRepository;

    @Autowired
    public void setLayerCRUDRepository(LayerCRUDRepository layerCRUDRepository) {
        this.layerCRUDRepository = layerCRUDRepository;
    }

    @Override
    public Layer create(Layer layer) {
        return layerCRUDRepository.save(layer);
    }

    @Override
    public Layer read(String id) {
        return layerCRUDRepository.findOne(id);
    }

    @Override
    public Layer update(Layer layer) {
        return layerCRUDRepository.save(layer);
    }

    @Override
    public void delete(String id) {
        layerCRUDRepository.delete(id);
    }
}

En la implementación, únicamente tenemos que definir el repository que vamos a utilizar, y luego emplear los métodos que hereda de MongoRepository.

Capa Rest controller.

A continuación, se muestra el Controller con los cuatro métodos de acceso al Api con sus respectivos protocolos:

@RestController
@RequestMapping("/layer/crud")
public class LayerCRUDController {

    private LayerCRUDService layerCRUDService;

    @Autowired
    public void setLayerCRUDService(LayerCRUDService layerCRUDService) {
        this.layerCRUDService = layerCRUDService;
    }

    // C
    @RequestMapping(value = "/",method = RequestMethod.POST)
    public Layer create(@RequestBody Layer layer){
        return layerCRUDService.create(layer);
    }

    // R
    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    public Layer read(@PathVariable("id") String id){
        return layerCRUDService.read(id);
    }

    // U
    @RequestMapping(value = "/",method = RequestMethod.PUT)
    public Layer update(@RequestBody Layer layer){
        return layerCRUDService.update(layer);
    }

    // D
    @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
    public void delete(@PathVariable("id") String id){
        layerCRUDService.delete(id);
    }
}

Tenemos que inyectar nuestro LayerCRUDService para poder utilizar sus métodos. La etiqueta @RestController nos indica que los métodos de esta clase serán accesibles a través de un servicio Rest, en la ruta definida en @RequestMapping.

También vemos que cada método tiene definidos una ruta propia (que se añade a la anterior), y un RequestMethod que tendremos que utilizar en nuestras llamadas al Api.

En la segunda parte del post, os enseñaremos cómo utilizamos JWT para dotar de seguridad al Api, configurando una autorización en los request. También haremos pruebas con la herramienta Postman.

Todo el código esta en esta rama de Github.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s