FJRP - CCIA-2011
Date: Noviembre-2011
|
Se trabajará sobre el subproyecto Java Web GestionReservas-rest, incialmente vacío.
Sobre el proyecto ''GestionReservas-rest'' -> [botón derecho] -> seleccionar ''Properties'' En ''Libraries'', pulsar botón ''AddProject'' y seleccionar ''GestionReservas-ejb'' [Add Project JAR files] + [OK]
Para este ejemplo será una clase vacía, cuya única utilidad es establecer el contexto de los recursos REST con la anotación @javax.ws.rs.ApplicationPath
(en nuestro caso la raiz de los recursos REST será http://localhost:8080/GestionReservas-rest/rest/)
package rest; @javax.ws.rs.ApplicationPath("rest") public class GestionReservasAplicacionREST extends javax.ws.rs.core.Application { }
Será un EJB de sesión local sin interfaz. Se hace así para poder usar el soporte de inyección de dependencias para acceder a los EJBs del proyecto GestionReservas-ejb
EJB Name: GestionReservasClienteREST Package: rest SessionType: Stateless No seleccionar ningún interfaz
@Stateless @LocalBean @Path("/clientes") @Produces({"application/xml", "application/json"}) @Consumes({"application/xml", "application/json"}) public class GestionReservasClienteREST { ... }
Se declararán como private y se anotarán con @XmlElement para que JABX los incluya en los XML generados
package jaxb; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class ClienteREST { private Long id; private String nombre; private String apellidos; private String nif; private String domicilio; private String localidad; private String codPostal; private String provincia; private String telefono; private String URI; // Alamcena el URI del recurso public ClienteREST() { } public ClienteREST(entidades.Cliente cliente, String URIbase) { this.id = cliente.getId(); this.nombre = cliente.getNombre(); this.apellidos = cliente.getApellidos(); this.nif = cliente.getNif(); this.domicilio = cliente.getDomicilio(); this.localidad = cliente.getLocalidad(); this.codPostal = cliente.getCodPostal(); this.provincia = cliente.getProvincia(); this.telefono = cliente.getTelefono(); this.URI = URIbase + this.id; // Construye el URI } @XmlAttribute // Para serializar el ID como atributo XML y no como elemento public String getId(){ return this.id; } ... }
@Stateless @LocalBean @Path("/clientes") @Produces({"application/xml", "application/json"}) @Consumes({"application/xml", "application/json"}) public class EjemploREST { @EJB ClienteDAOLocal clienteDAO; ... }
@Stateless @LocalBean @Path("/clientes") @Produces({"application/xml", "application/json"}) @Consumes({"application/xml", "application/json"}) public class EjemploREST { @EJB ClienteDAOLocal clienteDAO; @Context private UriInfo uriInfo; // Info. sobre la URI donde servidor despliega el recurso ... }
@GET public List<ClienteREST> listaClientes() { List<ClienteREST> lista = new ArrayList<ClienteREST>(); String uriBase = uriInfo.getBaseUri().toString(); for (Cliente c : clienteDAO.buscarTodos()) { lista.add(new ClienteREST(c, uriBase)); } return lista; }
@Path("/{id}") @GET public ClienteREST clientePorId(@PathParam("id") Long id) { Cliente c = clienteDAO.buscarPorId(id); return (new ClienteREST(c, uriInfo.getBaseUri().toString())); }
@Path("/{id}") @DELETE public void borrarCliente(@PathParam("id") Long id) { Cliente c = clienteDAO.buscarPorId(id); clienteDAO.eliminar(c); }
@POST @TransactionAttribute(TransactionAttributeType.NEVER) // Para que el clienteDAO // gestione (y termine) // su propia transacción public Response crearCliente(JAXBElement<ClienteREST> clienteJAXB) { ClienteREST clienteREST = clienteJAXB.getValue(); Cliente nuevo = new Cliente(); nuevo.setNombre(clienteREST.getNombre()); nuevo.setApellidos(clienteREST.getApellidos()); nuevo.setNif(clienteREST.getNif()); nuevo.setDomicilio(clienteREST.getDomicilio()); nuevo.setCodPostal(clienteREST.getCodPostal()); nuevo.setProvincia(clienteREST.getProvincia()); nuevo.setTelefono(clienteREST.getTelefono()); nuevo = clienteDAO.crear(nuevo); URI nuevoURI = uriInfo.getAbsolutePathBuilder().path(nuevo.getId(). toString()).build(); return Response.created(nuevoURI).build(); }
curl -v http://localhost:8080/GestionReservas-rest/rest/clientes curl -v -X GET -H"Accept: application/json" http://localhost:8080/GestionReservas-rest/rest/clientes curl -v http://localhost:8080/GestionReservas-rest/rest/clientes/4 curl -v -X GET -H"Accept: application/json" http://localhost:8080/GestionReservas-rest/rest/clientes/4 curl -v -X POST http://localhost:8080/GestionReservas-rest/rest/clientes \ -HContent-type:application/xml \ --data "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> \ <clienteREST> \ <nombre>Lucas</nombre> \ <apellidos>Grijander Grijander</apellidos> \ <nif>33333333C</nif> \ <domicilio>Su casa</domicilio> <localidad>Santiago</localidad> \ <codPostal>15333</codPostal><provincia>A Coruña</provincia> \ <telefono>981333333</telefono> \ </clienteREST>"
@Path("hoteles")
(URI: http://localhost:8080/GestionReservas-rest/rest/hoteles)
<hotelRESTs> <hotelREST id="1"> <categoria>2 estrellas</categoria> <codPostal>32004</codPostal> <descripcion>Hotel Restaurante Pepe</descripcion> <domicilio>As Lagoas</domicilio> <localidad>Ourense</localidad> <nombre>Hotel Pepe</nombre> <provincia>Ourense</provincia> <telefono>988333333</telefono> <URI>http://localhost:8080/GestionReservas-rest/rest/hoteles/1</URI> </hotelREST> <hotelREST id="2"> <categoria>2 estrellas</categoria> <codPostal>32008</codPostal> <descripcion>Hostal Residencia Lucas</descripcion> <domicilio>A Ponte</domicilio> <localidad>Ourense</localidad> <nombre>Hostal Lucas</nombre> <provincia>Ourense</provincia> <telefono>988777777</telefono> <URI>http://localhost:8080/GestionReservas-rest/rest/hoteles/2</URI> </hotelREST> ... </hotelRESTs>
<hotelREST id="2"> <categoria>2 estrellas</categoria> <codPostal>32008</codPostal> <descripcion>Hostal Residencia Lucas</descripcion> <domicilio>A Ponte</domicilio> <localidad>Ourense</localidad> <nombre>Hostal Lucas</nombre> <provincia>Ourense</provincia> <telefono>988777777</telefono> <URI>http://localhost:8080/GestionReservas-rest/rest/hoteles/2</URI> </hotelREST>
<tipoHabitacionRESTs> <tipoHabitacionREST id="4"> <capacidad>2</capacidad> <descripcion>Habitación doble económica con TV y baño</descripcion> <nombre>Doble</nombre> <precio>35.0</precio> <URI>http://localhost:8080/GestionReservas-rest/rest/hoteles/2/habitaciones/4</URI> <URIHotel>http://localhost:8080/GestionReservas-rest/rest/hoteles/2</URIHotel> </tipoHabitacionREST> <tipoHabitacionREST id="5"> <capacidad>1</capacidad> <descripcion>Habitación individual económica con TV</descripcion> <nombre>Individual</nombre> <precio>25.0</precio> <URI>http://localhost:8080/GestionReservas-rest/rest/hoteles/2/habitaciones/5</URI> <URIHotel>http://localhost:8080/GestionReservas-rest/rest/hoteles/2</URIHotel> </tipoHabitacionREST> ... </tipoHabitacionRESTs>
@GET @Path("{id:[0-9]+}/habitaciones") public List<TipoHabitacionREST> getHabitacionesPorHotel(@PathParam("id") Long id) { String uriBase = uriInfo.getBaseUri().toString(); Hotel h = hotelDAO.buscarPorId(id); List<TipoHabitacionREST> lista = new ArrayList<TipoHabitacionREST>(); for (TipoHabitacion t : h.getTiposHabitacion()) { lista.add(new TipoHabitacionREST(t, uriBase)); } return lista; }
http://localhost:8080/GestionReservas-rest/rest/hoteles/2/disponibilidad?fechaInicio=1/1/2011&fechaFin=2/2/2011
@GET @Path("{id:[0-9]+}/disponibilidad2) public List<TipoHabitacionREST> getHabitacionesPorHotelYFecha(@PathParam("id") Long id, @QueryParam("fechaInicio") Date fechaInicio, @QueryParam("fechaFin") Date fechaFin) { ... }
@GET @Path("{id:[0-9]+}/disponibilidad") public List<TipoHabitacionREST> getHabitacionesPorHotelYFecha(@PathParam("id") Long id, @QueryParam("fechaInicio") String strInicio, @QueryParam("fechaFin") String strFin) throws ParseException { SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyyy"); Date fechaInicio = s.parse(strInicio); Date fechaFin = s.parse(strFin); ... }
<reservaRESTs> <reservaREST id="3"> <cantidad>1</cantidad> <fechaFin>2010-02-08T00:00:00+01:00</fechaFin> <fechaInicio>2010-02-04T00:00:00+01:00</fechaInicio> <idCliente>4</idCliente> <idTipoHabitacion>4</idTipoHabitacion> <idhotel>2</idhotel> <nombreTomador>Marcos</nombreTomador> <ocupacion>1</ocupacion> <precio>35.0</precio> <URI>http://localhost:8080/GestionReservas-rest/rest/reservas/3</URI> </reservaREST> <reservaREST id="82> <cantidad>1</cantidad> <fechaFin>2010-03-22T00:00:00+01:00</fechaFin> <fechaInicio>2010-03-27T00:00:00+01:00</fechaInicio> <idCliente>3</idCliente> <idTipoHabitacion>4</idTipoHabitacion> <idhotel>2</idhotel> <nombreTomador>luis</nombreTomador> <ocupacion>1</ocupacion> <precio>35.0</precio> <URI>http://localhost:8080/GestionReservas-rest/rest/reservas/8</URI> </reservaREST> ... </reservaRESTs>
Crear una nueva clase para gestionar los recursos REST dentro del ''path'' @Path("reservas")
(http://localhost:8080/GestionReservas-rest/rest/reservas)
<reservaRESTs> <reservaREST id="1"> <cantidad>1</cantidad> <fechaFin>2010-02-03T00:00:00+01:00</fechaFin> <fechaInicio>2010-02-01T00:00:00+01:00</fechaInicio> <idCliente>3</idCliente> <idTipoHabitacion>1</idTipoHabitacion> <idhotel>1</idhotel> <nombreTomador>Luis</nombreTomador> <ocupacion>1</ocupacion> <precio>45.0</precio> <URI>http://localhost:8080/GestionReservas-rest/rest/reservas/1 </URI> </reservaREST> <reservaREST id="2"> <cantidad>1</cantidad> <fechaFin>2010-02-07T00:00:00+01:00</fechaFin> <fechaInicio>2010-02-05T00:00:00+01:00</fechaInicio> <idCliente>3</idCliente> <idTipoHabitacion>1</idTipoHabitacion> <idhotel>1</idhotel> <nombreTomador>Luis</nombreTomador> <ocupacion>1</ocupacion> <precio>45.0</precio> <URI>http://localhost:8080/GestionReservas-rest/rest/reservas/2</URI> </reservaREST> <reservaREST id="3"> ... </reservaREST> ... </reservaRESTs>
curl -v -XPOST http://localhost:8080/GestionReservas-rest/rest/reservas \ -HContent-type:application/xml \ --data "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> \ <reservaREST> \ <cantidad>1</cantidad> \ <fechaInicio>2010-12-21</fechaInicio> \ <fechaFin>2010-12-27</fechaFin> \ <idCliente>4</idCliente> \ <idTipoHabitacion>1</idTipoHabitacion> \ <idhotel>1</idhotel> \ <nombreTomador>pruba REST</nombreTomador> \ <ocupacion>1</ocupacion> \ <precio>45.0</precio> \ </reservaREST> ""
@POST @TransactionAttribute(TransactionAttributeType.NEVER) // Fuerza a que reservaDAO gestione (y termine) su propia transaccion public Response crearReserva(JAXBElement<ReservaREST> reservaJAXB) { ReservaREST reservaREST = reservaJAXB.getValue(); Reserva nueva = new Reserva(); nueva.setFechaInicio(reservaREST.getFechaInicio()); nueva.setFechaFin(reservaREST.getFechaFin()); nueva.setCantidad(reservaREST.getCantidad()); nueva.setNombreTomador(reservaREST.getNombreTomador()); nueva.setOcupacion(reservaREST.getOcupacion()); nueva.setCliente(clienteDAO.buscarPorId(reservaREST.getIdCliente())); nueva.setTipoHabitacion(hotelDAO.buscarTipoHabitacion(reservaREST.getIdTipoHabitacion())); nueva = reservaDAO.crear(nueva); URI nuevaURI = uriInfo.getAbsolutePathBuilder().path(nueva.getId().toString()).build(); return Response.created(nuevaURI).build(); }
La documentación y el código a entregar para esta ''iteración 2'' se integrarán con los de la ''iteración 1''.