Recent comments

EJB (jar) y JPA con JAX-WS (Parte 4)

El objetivo del ejercicio exponer el método listarPersonas del EJB del proyecto SGA como un Web Services con ayuda del API JAX-WS. El resultado se muestra a continuación

Estructura Final:



1.- Arquitectura:

2.- Agregamos la nueva interfaz PersonaServiceWS @WebService y @WebMethod

package mx.com.gm.sga.servicio;

import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
import mx.com.gm.sga.domain.Persona;

@WebService
public interface PersonaServiceWS {

    @WebMethod
    public List<Persona> listarPersonas();
}

3.- Modificamos la implementacion simplemente para agregar despues de la definicion del EJB (@Stateless) la anotacion @WebService con su respectivo endpoint a la interfaz y finalmente implementamos tambien la interfaz PersonaServiceWS

package mx.com.gm.sga.servicio;

import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
import mx.com.gm.sga.domain.Persona;
import javax.jws.WebService;
import mx.com.gm.sga.eis.PersonaDao;

@Stateless
//nuevo cambio
@WebService(endpointInterface = "mx.com.gm.sga.servicio.PersonaServiceWS")
public class PersonaServiceImpl implements PersonaServiceRemote, PersonaService, PersonaServiceWS {

        //Se puede usar la anotacion @EJB o @Inject usa el concepto CDI
@Inject
private PersonaDao personaDao;

        @Override
public List<Persona> listarPersonas() {
return personaDao.findAllPersonas();
}

        @Override
public Persona encontrarPersonaPorId(Persona persona) {
return personaDao.findPersonaById(persona);
}

        @Override
public Persona encontrarPersonaPorEmail(Persona persona) {
return personaDao.findPersonaByEmail(persona);
}

        @Override
public void registrarPersona(Persona persona) {
personaDao.insertPersona(persona);
}

        @Override
public void modificarPersona(Persona persona) {
personaDao.updatePersona(persona);
}

        @Override
public void eliminarPersona(Persona persona) {
personaDao.deletePersona(persona);
}
}

4.- Modificamos la clase de dominio persona:

1)Agregar la anotación @XmlAccessorType a nivel de la clase, especificando cual es la interface a utilizar: @XmlAccessorType(XmlAccessType.FIELD) Esta anotación del API de JAXB, significa que cada uno de los atributos de la clase se utilizará en el Web Service, y se validará con el esquema XSD, el cual es parte del mensaje Web Service.

2)Excluir la relación con la colección de Usuarios. Para esto agregamos la anotación @XmlTransient al atributo usuarios de la clase Persona. Esta anotación debe ir antes de la anotación @OneToMany de dicho atributo: @XmlTransient Esta anotación la estamos agregando ya que la clase Persona tiene una relación con muchos Usuarios, y la clase Usuarios tiene una relación con una Persona, esto genera una relación circular, la cual el API de JAXB no soporta, para evitar este problema, indicamos que el atributo private Set usuarios no formará parte del envío del mensaje del Web Services. Esto no afecta a la configuración de JPA que también está incluida en la clase de dominio Persona y soporta sin problemas la navegación bidireccional.

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;

@Entity
@NamedQueries({
    @NamedQuery(name = "Persona.findAll", query = "SELECT p FROM Persona p ORDER BY p.idPersona")})
@Table(name = "persona")
//nuevo cambio
@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 + "]";
    }


5.- Creamos el jar y hacemos deploy en el servidor. (Borrar otras versiones para no causar conflicto).
Una vez cargado podemos ejecutar la prueba en SOAPUI por ejemplo.

WSDL:
http://desktop-322kafb:9090/PersonaServiceImplService/PersonaServiceImpl?wsdl




Codigo Fuente

Con esto tenemos un jar usando JPA, con EJB y Web Services usando Jax-WS


No hay comentarios.