Saltar la navegación

Ejercicio 2: Recursos

Objetivos

En este ejercicio pondremos en práctica y analizaremos:

  • la interacción de un servicio web con el modelo (Objetos del dominio)
  • la anotación @Produces para producir la información de una persona en tres formatos diferentes (XML, JSON y TEXT)
  • la anotación @Path a tanto a nivel de Clase como de Método

Arquitectura del ejercicio

ejercicio 2 arquitectura

Instrucciones

  1. Crea un proyecto "Dynamic Web Project". Lo llamaremos: "rest_ejercicio2_formato"
    1. Check en descriptor de despliegue (web.xml)
    2. En la carpeta Web-INF/lib copiar las librerías para Servicios Web (Jersey, Jackson, JAXB).
      1. Puedes descargarlas del apartado Servicios Web-REST de :https://ciniguez.github.io/balava/libreriasjava/
  2. Creación del Modelo:
    1. Crea el paquete con el nombre modelo
    2. Crea la Clase Persona en el paquete "modelo" (Ver Persona.java)
      1. Crea un constructor vacío y los accesores de los métodos privados (Getters y Setters)
      2. Anota la Clase Persona con @XmlRootElement . Esta notación de JAXB permitirá convertir el objeto Persona en XML.
  3. Creación del DAO:
    1. Crea el paquete DAO
    2. Crea la Clase ImplPersonaDAO en el paquete "DAO" (Ver ImplPeresonaDAO.java)
  4. Creación del Servicio Web:
    1. Crea el paquete serviciosrest.persona
    2. En el web.xml, asocia el paquete de recursos al servlet de Jersey (ver línea 12 del fichero: web.xml)
    3. Crea la clase FormatosRecurso con los tres métodos: getPersonaXML, getPersona JSON y getPersonaTEXT. (Ver FormatosRecurso.java)
    4. Utiliza la notación @Produces para indicar el tipo de "media" que cada método producirá (APPLICATION_XML, APPLICATION_JSON y TEXT_PLAIN, respectivamente)
  5. Usa un cliente de Servicios REST (ej. Advanced Rest Client) para consumir los diferentes servicios. Usa las siguientes URLs:
    1. Para el formato XML: http://localhost:8080/5_serviciosweb_1/rest/personasformato/xml
    2. Para el formato JSON: http://localhost:8080/5_serviciosweb_1/rest/personasformato/json
    3. Para el formato TEXT: http://localhost:8080/5_serviciosweb_1/rest/personasformato/txt

Código

Persona.java

package modelo;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Persona implements Serializable{

	private static final long serialVersionUID = 1L;
	private Integer id;
	private String nombre;
	private String apellido;

	public Persona() {}
	
	public Persona(Integer id, String nombre, String apellido) {
		this.id = id;
		this.nombre = nombre;
		this.apellido = apellido;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
	@Override
	public int hashCode() {
		int hash = 0;
		hash += (id != null ? id.hashCode() : 0);
		return hash;
	}

	@Override
	public boolean equals(Object object) {
		if(!(object instanceof Persona)) {
			return false;
		}
		Persona other = (Persona) object;
		if((this.id== null && other.id!= null)||(this.id!= null && !this.id.equals(other.id))) {
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		return "Usuario: "+ this.apellido+ " "+this.nombre;
	}
	
}



ImplPersonaDAO.java

package DAO;

import java.util.ArrayList;
import java.util.List;
import modelo.Persona;

public class ImplPersonaDAO {

	public static List<Persona> getPersonas() {
		List<Persona> personas = new ArrayList<Persona>();
		personas.add(new Persona(1, "Carlos", "Iniguez"));
		personas.add(new Persona(2, "Pedro", "Garcia"));
		return personas;
	}

	public static Persona getPersonasById(int id) {
		List<Persona> personas = ImplPersonaDAO.getPersonas();

		for (Persona persona : personas) {
			if (persona.getId().equals(id)) {
				return persona;
			}
		}

		return null;
	}

	public static void ActualizarPersona(Persona p) {

	}

}



FormatosRecurso.java

package serviciosrest.persona;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import DAO.ImplPersonaDAO;
import modelo.Persona;

@Path("/personasformato")
public class FormatosRecurso {
	/**
	 * Obtener la información en XML
	 * @return Persona en formato XML
	 */
	@GET
	@Path("/xml")
	@Produces(MediaType.APPLICATION_XML)
	public Response getPersonaXML() {
		Persona persona = ImplPersonaDAO.getPersonasById(1);
		return Response.ok(persona).build();
	}

	/**
	 * Obtener la información en JSON
	 * @return Persona en formato JSON
	 */
	@GET
	@Path("/json")
	@Produces(MediaType.APPLICATION_JSON)
	public Response getPersonaJSON() {
		Persona persona = ImplPersonaDAO.getPersonasById(1);
		return Response.ok(persona).build();
	}

	/**
	 * Obtener la información en Texto
	 * @return Persona en formato TEXT
	 */
	@GET
	@Path("/txt")
	@Produces(MediaType.TEXT_PLAIN)
	public Response getPersonaTEXT(){
		Persona persona = ImplPersonaDAO.getPersonasById(1);
		return Response.ok(persona.toString()).build();
	}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>5_serviciosweb_1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>serviciosrest.persona</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>