martes, 4 de agosto de 2015

WebService con JAX-WS, JAXB y JPA - II

Vamos a mejorar el ejemplo que teniamos del webservices con JAX-WS. Ahora para introducirle la capa de acceso a datos. Esta parte la haremos usando otro estandar de Java EE: JPA.

¿Que es JPA o JAXB?
  • JPA: Es la API que permite hacer representaciones Java de objetos de BBDD relacionales y facilitar su manejo. Enlace Wikpedia Enlace Oficial
  • JAXB: Es la API que permite hacer representaciones java de documentos XML y facilitar su manejo. 
Para empezar le añadimos las librerías necesarias para que funcione JPA. Para ello elegimos la implementación de Hibernate:
  • hibernate-entitymanager: La implementación para el uso del entity manager por Hibernate.
  • hibernate-jpa-2.1-api: La implementación de Hibernate de JPA
  • Conector de base de datos: En mi caso MySQL. 
Una vez configurado las librerías vamos a crear el fichero de configuración de BBDD, con JPA normalmente es el conocido 'persistence.xml':


 org.hibernate.ejb.HibernatePersistence
 
  
  
  
  
  
  
  
  
 


En el podemos ver la siguiente configuración:
  • Hemos llamado a nuestra configuración 'myPersistenceUnit'.
  • Hemos indicado los datos de conexión: URL, usuario, password, driver de conexión, etc
  • Hemos indicado que se autodetecten las clases que utilizaremos para conectar a la BBDD. De lo contrario deberiamos indicar especificamente que clase serán las que representen los objetos relacionales de BBDD. 
  • Hemos indicado configuración adicional sobre las querys. En este caso que se muestren y se muestren formateadas. 
Para la parte de acceso a datos hemos creado una clase abstracta que permite obtener la entidad gestora de BBDD configurada en nuestro archivo, pero para eso deberemos indicarle cual es nuestra configuración

public abstract class AbstractDao {
 private static EntityManagerFactory emf;
 private final ThreadLocal em = new ThreadLocal() {
  @Override
  protected EntityManager initialValue() {
   return getEntityManagerFactory().createEntityManager();
  }
 };
 private EntityManagerFactory getEntityManagerFactory() {
  if (emf == null) {
   emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
  }
  return emf;
 }
 protected EntityManager getEntityManager() {
  return em.get();
 }
}

Por otro lado creamos una interface DAO y su implementación con los cuales acceder a los datos de BBDD.

Ya casi estaría listo, crearemos un método del Web Service que llame a ese servicio DAO y que pueda obtener los datos de BBDD. Pero nos quedaría un pequeño asunto, ¿Como indicamos el formato de la respuesta?. Para esto utilizaríamos el JAXB, crearemos clases que tengan el formato de la información que queremos devolver en el servicio. Este formato se lo podemos indicar a través de anotaciones. Aquí un ejemplo de clase JAXB

@XmlRootElement
public class UserXml implements java.io.Serializable {
 private Integer userId;
 private String username;
 private String password;
 private boolean enabled;
 @XmlElement
 public Integer getUserId() {
  return userId;
 }
 @XmlElement
 public String getUsername() {
  return username;
 }
 @XmlElement
 public String getPassword() {
  return password;
 }
 @XmlElement
 public boolean isEnabled() {
  return enabled;
 }
        //setters
 public void setEnabled(final boolean enabled) {
  this.enabled = enabled;
 }
 public static UserXml valueOf(final User user) {
  UserXml userXml = new UserXml();
  userXml.setEnabled(user.isEnabled());
  userXml.setPassword(user.getPassword());
  userXml.setUserId(user.getUserId());
  userXml.setUsername(user.getUsername());
  return userXml;
 }

}

Y aquí un ejemplo del servicio web:

public List getUsers() {
 List list = dao.getUsers();
 List result = new ArrayList();
 for (User p : list) {
  result.add(UserXml.valueOf(p));
 }
 return result;
}

No hay comentarios:

Publicar un comentario