WEB APP (Servlets y JSP) EJB (war y jar) y JPA con JAX WS y JAX RS(Parte 6)
Objetivo:
Exponer el método listarPersonas del EJB del proyecto SGA (ahora WAR) utilizando Rest Web Services con ayuda del API JAX-RS.
Arquitectura:
1.- Agregamos al proyecto anterior la dependencia de jersey.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mx.com.gm</groupId>
<artifactId>sga-jee6-web-jax-rs</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>sga-jee6-web-jax-rs</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.27</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${endorsed.dir}</outputDirectory>
<silent>true</silent>
<artifactItems>
<artifactItem>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>7.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
5.- Ejecutamos y tenemos los siguientes archivos:
wadl
http://localhost:9090/sga-jee6-web-jax-rs/webservice/application.wadl
xsd
http://localhost:9090/sga-jee6-web-jax-rs/webservice/application.wadl/xsd0.xsd
Éste ultimo nos regresa la salida que esperamos.
Ejecutando el listado de personas:
http://localhost:9090/sga-jee6-web-jax-rs/webservice/personas
Codigo Fuente
Finamente en este ejercicio agregamos las siguinetes funcionalidades a el proyecto
JSP, Servlets,
EJB
JPA
JAX RS
JAX WS
Ahora nos falta crear el cliente que consuma dicho servicio.
Exponer el método listarPersonas del EJB del proyecto SGA (ahora WAR) utilizando Rest Web Services con ayuda del API JAX-RS.
Arquitectura:
1.- Agregamos al proyecto anterior la dependencia de jersey.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mx.com.gm</groupId>
<artifactId>sga-jee6-web-jax-rs</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>sga-jee6-web-jax-rs</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.27</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${endorsed.dir}</outputDirectory>
<silent>true</silent>
<artifactItems>
<artifactItem>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>7.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.- Agregamos la clase que expondra los servicios rest:
package mx.com.gm.sga.servicio.rest;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import mx.com.gm.sga.domain.Persona;
import mx.com.gm.sga.servicio.PersonaService;
@Path("/personas")
@Stateless
public class PersonaServiceRS {
@EJB
private PersonaService personaService;
@GET
@Produces(value={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<Persona> listarPersonas() {
return personaService.listarPersonas();
}
@GET
@Produces(value={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("{id}") //hace referencia a /personas/{id}
public Persona encontrarPersonaPorId(@PathParam("id") int id) {
return personaService.encontrarPersonaPorId(new Persona(id));
}
@POST
@Produces(value={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes(value={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response agregarPersona(Persona persona) {
try {
personaService.registrarPersona(persona);
return Response.ok().entity(persona).build();
} catch (Exception e) {
return Response.status(Status.INTERNAL_SERVER_ERROR).build();
}
}
@PUT
@Produces(value={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes(value={MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("{id}")
public Response modificarPersona(@PathParam("id") int id, Persona personaModificada) {
try {
Persona persona = personaService.encontrarPersonaPorId(new Persona(id));
if (persona != null) {
personaService.modificarPersona(personaModificada);
return Response.ok().entity(personaModificada).build();
} else {
return Response.status(Status.NOT_FOUND).build();
}
} catch (Exception e) {
return Response.status(Status.INTERNAL_SERVER_ERROR).build();
}
}
@DELETE
@Path("{id}")
public Response eliminarPersonaPorId(@PathParam("id") int id) {
try {
personaService.eliminarPersona(new Persona(id));
return Response.ok().build();
} catch (Exception e) {
return Response.status(404).build();
}
}
}
3.- Modificamos la clase persona y agregamos @XmlRootElement:
package mx.com.gm.sga.domain;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@NamedQueries({
@NamedQuery(name = "Persona.findAll", query = "SELECT p FROM Persona p ORDER BY p.idPersona")})
@Table(name = "persona")
//nuevo cambio
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Persona implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_persona")
private int idPersona;
@Column(nullable = false, length = 45)
private String nombre;
@Column(name = "apellido_paterno", nullable = false, length = 45)
private String apePaterno;
@Column(name = "apellido_materno", length = 45)
private String apeMaterno;
@Column(nullable = false, length = 45)
private String email;
@Column(length = 45)
private String telefono;
public Persona() {
}
public Persona(int idPersona) {
this.idPersona = idPersona;
}
public Persona(int idPersona, String nombre, String apePaterno, String apeMaterno,
String email, String telefono) {
this.idPersona = idPersona;
this.nombre = nombre;
this.apePaterno = apePaterno;
this.apeMaterno = apeMaterno;
this.email = email;
this.telefono = telefono;
}
public int getIdPersona() {
return idPersona;
}
public void setIdPersona(int idPersona) {
this.idPersona = idPersona;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApePaterno() {
return apePaterno;
}
public void setApePaterno(String apePaterno) {
this.apePaterno = apePaterno;
}
public String getApeMaterno() {
return apeMaterno;
}
public void setApeMaterno(String apeMaterno) {
this.apeMaterno = apeMaterno;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTelefono() {
return telefono;
}
public void setTelefono(String telefono) {
this.telefono = telefono;
}
@Override
public String toString() {
return "Persona [idPersona=" + idPersona + ", nombre=" + nombre
+ ", apePaterno=" + apePaterno + ", apeMaterno=" + apeMaterno
+ ", email=" + email + ", telefono=" + telefono + "]";
}
}
4.- Finalmente en el archivo web.xml agregamos la descripcion del servlet de Jersey
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>JerseyWebApplication</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>mx.com.gm.sga.servicio.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JerseyWebApplication</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
</web-app>
5.- Ejecutamos y tenemos los siguientes archivos:
wadl
http://localhost:9090/sga-jee6-web-jax-rs/webservice/application.wadl
xsd
http://localhost:9090/sga-jee6-web-jax-rs/webservice/application.wadl/xsd0.xsd
Éste ultimo nos regresa la salida que esperamos.
Ejecutando el listado de personas:
http://localhost:9090/sga-jee6-web-jax-rs/webservice/personas
Codigo Fuente
Finamente en este ejercicio agregamos las siguinetes funcionalidades a el proyecto
JSP, Servlets,
EJB
JPA
JAX RS
JAX WS
Ahora nos falta crear el cliente que consuma dicho servicio.
No hay comentarios.