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''.