viernes, 24 de febrero de 2017

JPA 2.1 04: Clases de entidad y de manejo de persistencia

Vamos a crear varias entidades. Abordando el tema de las elecciones locales, que cada 4 años o menos se celebran vamos a crear una tabla de partidos políticos.

Para ello se especificaran 2 clases:

  1. src.main.java,org,ximodante.entities.Party
  2. src.main.java,org,ximodante.persistence.testEntityManager



package src.main.java.org.ximodante.entities;
 
import java.io.Serializable;
import javax.persistence.*;
 
/**
 * Entity implementation class for Entity: party
 *
 */
@Entity
@Table(name = "elecparty", schema="myschema") 
public class Party implements Serializable {
 
  
 
 private static final long serialVersionUID = 1L;
     
 @Id
 @Column(name = "id")
 @GeneratedValue(strategy = GenerationType.AUTO)
 private Long id;
  
 @Column(name = "initial")
 private String initial;
  
 @Column(name = "name")
 private String name;
  
 public Party() {
  super();
 }
 
 // Autogenerated getters and setters 
  
 public Party(String initial, String name) {
  super();
  this.initial = initial;
  this.name = name;
 }
  
 public Long getId() {
  return id;
 }
 
 public void setId(Long id) {
  this.id = id;
 }
 
 public String getInitial() {
  return initial;
 }
 
 public void setInitial(String initial) {
  this.initial = initial;
 }
 
 public String getName() {
  return name;
 }
 
 public void setName(String name) {
  this.name = name;
 }
 
 public static long getSerialversionuid() {
  return serialVersionUID;
 }
    
}

Ahora vamos a crear la calse manejadora de persistencia

package src.main.java,org.ximodante.persistence;
 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
 
import src.main.java.org.ximodante.entities.Party;
 
public class testEntityManager {
 
 /**
  * @param args
  */
 EntityManagerFactory emf = null;
 EntityManager em = null;
  
 public static void main(String[] args) {
  // TODO Auto-generated method stub
 
  EntityManagerFactory emf = Persistence.createEntityManagerFactory("postgres");
  EntityManager em = emf.createEntityManager();
   
  persistSomeData(em);
  em.close();
  emf.close();
 }
  
 private static void persistSomeData (EntityManager em ) {
  em.getTransaction().begin();
    em.persist (new Party("PSPV-PSOE","Partit Socialista del Pais Valencià"));
    em.persist (new Party("PP"       ,"Partit Popular"));
    em.persist (new Party("EUPV"     ,"Esquerra Unida del Pais Valencià"));
    em.persist (new Party("UPyD"     ,"Unión Progreso y Democracia"));
    em.persist (new Party("Bloc"     ,"Compromis Bloc"));
    em.persist (new Party("ERC"      ,"Esquerra Republicana de Catalunya"));
    em.getTransaction().commit();   
 }
 
} 


Si ejecutamos podemos comprobar que:

  1. Si la BBDD o el esquema no están creado en Postgres, entonce da error. Por tanto las BBDD y los esquemas si se utilizan, se deben crear previamente.
  2. Se creará la tabla elecparty dentro del esquema myschema.

jueves, 23 de febrero de 2017

JPA 2.1 03: Persistence.xml NO ENCONTRADO

Si tenemos este problema,

No persistence.xml file found in project

y tal como se indica en Stackoverflow, podemos proceder a situarnos sobe el proyecto y Boton derecho - propiedades - Java Build Path y damos al botón Add Folder  y añadimos la ruta nuestro_proyecto/sc/main/resources y le damos al botón Apply y OK



A continuación le damos a maven -update project y debería de desaparecer el error

JPA 2.1 02: Persistence.xml

Los siguientes linls me han ayudado a comprender un poco estos detalles:

  1. Stackoverflow
  2. ObjectDB

El fichero persistence.xml se sitúa dentro de la carpeta /src/main/resources/META-INF. En concreto en mi caso:

   src/main/resources/META-INF


Veamos el contenido típico de este fichero



<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="postgres">
        <description>
            Mi tutorial de persistencia en PostgreSQL
        </description>
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" 
                      value="org.postgresql.Driver" />
            <property name="javax.persistence.jdbc.url" 
                      value="jdbc:postgresql://127.0.0.1:5432/JPA21_01" />
            <property name="javax.persistence.jdbc.user" 
                      value="usuarioBD" />
            <property name="javax.persistence.jdbc.password" 
                      value="contraseñaBD" />
            <property name="hibernate.show_sql" 
                      value="true" />
            <property name="hibernate.hbm2ddl.auto"
                      value="update" />
        </properties>
    </persistence-unit>
</persistence>

Analicemos este fichero:

1. <persistence> indica las urls y la versión 2.1 de la JPA

2. <persistence-unit> indica que podemos utilizar varias BBDD o esquemas, ya sea para separar los entornos de producción y desarrollo o para poder separar la BBDD en esquemas. En este caso solo utilizaremos un persistence unit

3. Podemos utilizar varias persistence-unit si tenemos la basew de datos distribuida

miércoles, 22 de febrero de 2017

JPA 2.1 01: Crear un proyecto con eclipse

1. Creamos un proyecto JAVA simple y normal (File - New - Project - Java Project) y le doy el nompre JPA21_01

2. Creamos los siguientes paquetes dentro de src:

  1. main.java.org.ximodante.entities
  2. main.java.org.ximodante.persistence
3. Creamos las siguientes carpetas dentro de src:
  1. main.resources
  2. main.resources.WEB-INF

3. Cremos un fichero en blanco persistence.xml dentro de  la carpeta main/resources/META-INF

4. Lo convertimos a Maven (Botón derecho Configure - Convert to Maven Project)

5. Comprobar que podemos ver el repositorio Maven Central (Window - Show View - Other - Maven - Maven Repositories)

6. Vamos al pom-xml y en la pestaña de Dependencies apretamos el botón Add y agregamos:
  *  hibernate-core (org.hibernate.javax.presistence), que sera la version 5.2.8.Final



si nos capturase una versión anterior, hay que ir a maven central y consultar la versión mas reciente.


y se puede copiar la dependencia al pom.xml


6. Comprobamos que nos quede así las dependencias:



7. Del mismo modo añadiremos las dependencias a Postgres en el pom.xml, buscando postgresql (org.postgresql) y en mi caso aparece la versión 9.4.1212.jre7. Pero esto puede dar problemas porque estamos en jre8. Para ellos entramos en Maven Central y buscamos postgresql y vemos que hay una versión 9.4.1212 que vamos a inidicarle como buena. Por cierto en el pom.xml hay que quitar la linea en rojo para que no de problemas:

<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>JPA21_01</groupId>
  <artifactId>JPA21_01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.8.Final</version>
    </dependency>
  
    <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4.1212</version>
        <type>bundle</type>
    </dependency>

 
  </dependencies>
</project>

 

8. Actualizamos nuestro proyecto con botón derecho - Maven - Update Project




WS-REST 04. Otros pequeños parámetros

Creemos esta clase de respuesta:


package main.java.org.ximodante.jersey;

import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;

@Path("/helloWorldREST")
public class HelloWorldREST {

  @GET
  @Path("/{parameter}")
  public Response responseMsg( 
    @PathParam("parameter") String parameter,
    @DefaultValue("Nothing to say") @QueryParam("value") String value) {

      String output = "Hello from: " + parameter + " : " + value;

      return Response.status(200).entity(output).build();
  }
}

Aquí tenemos las anotaciones @Path que hay que añadir a nuestra ruta y tambiém los parámetros que se deberán añadir.

Si ejecutamos esta ruta http://localhost/Jersey04/rest/helloWordREST/Ximo nos mostrará:

Hello from: Ximo : Nothing to say

WS-REST 03. Definir 2 clases: Aplicación y Respuesta

1. Creamos la clase te tipo Application que va a sustituir a WEB.xml ya que estamos en un servlet tipo 3.1. Esta clase la llamaremos ApplicationConfig o como queramos. Yo la creo dentro de src/main/java/org/ximodante/jersey


package main.java.org.ximodante.jersey;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest") // set the path to REST web services
public class ApplicationConfig extends Application {}


Esta clase nos envia nuestros servicios web a la ruta http://localhost/NOMBRE_PROYECTO/rest En mi caso NOMBRE_PROYECTO=Jersey04 , y "rest" viene del ApplicationPath

  2. Dentro del mismo paquete cramos otra clase que llamamos en mi caso RESTfulHelloWord.

package main.java.org.ximodante.jersey;

import java.util.Date; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Response; 

@Path("/") 
public class RESTfulHelloWorld{
  @GET 
  @Produces("text/html") 
  public Response getStartingPage() {    
    String output = "<h1>Hello World!<h1>" +      
      "<p>RESTful Service is running ... <br>Ping @ " + 
      new Date().toString() + 
      "</p<br>";    
    return Response.status(200).entity(output).build();   
  } 
} 

Tenemos que destacar @Path que se añade a nuestra ruta de ejecución:  http://localhost/Jersey04/rest

  3. Apretamos el botón de la derecha Maven - Update Project (y actualiza todas las dependencias y clases)

  4. Ejecutamos el proyecto en el servidor con Botón derecho Run As - Run on Server y seleccionamos nuestro servidor.

  5. Comprobamos que si se abre un navegador apunte a http://localhost/Jersey04/rest

  6. Saldrá :

Hello World!

RESTful Service is running ... Ping @ Wed Feb 22 10:19:13 CET 2017

WS-REST 02. Crear un proyecto en eclipse

1. Vamos a crear un proyecto en eclipse y creamos un Dynamic Web Project (File-New-Other-Web-Dynamic Web Project)


Le damos un nombre, por ejemplo Jersey04 y la version que sea 3.1 y le damos a terminar,

2. Creamos los paquetes src.main.java y src.main.resources

3. Dentro de src.main.java creamos un paquete de pruebas, en mi caso org.ximodante.jersey

4. Transformar el proyecto en un proyecto Maven. Para ello apretamos el botón derecho del raton sobre el proyecto y seleccionamos Configure-Convert to Maven Project y le damos al botón Finish

5. Para poder ver el repositorio de Maven se hace Window-Show View-Maven-Maven Repositories y con ello se podran descargar las librerías de maven. al cabo de un rato se descargan.

6. Vamos al pom.xml , y la pestaña inferior de Dependencies le damos al boton Add



y buscamos primeramente jersey-server (en Enter groupId, artifact or sha1 prefix or pattern(*)) y después jaxrs-ri, como podemos ver, eclipse busca en el repositorio de maven



seleccionamos com.sun.jersey y haciendo lo mismo con jaxrs-ri seleccionamos org.glassfish.jersey.bundles. Y al final queda





7. y si vemos el pom.xml

<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>Jersey04</groupId>
  <artifactId>Jersey04</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
  <dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-server</artifactId>
  <version>1.19.3</version>
  </dependency>
  <dependency>
  <groupId>org.glassfish.jersey.bundles</groupId>
  <artifactId>jaxrs-ri</artifactId>
  <version>2.26-b01</version>
  <type>bundle</type>
  </dependency>
  </dependencies>
</project>

Nos sale un error y hay que quitar la línea en rojo.

8. Vamos a decirle que utilice nuestro Tomcat que instalamos anteriormente. Nos situamos en el proyecto y apretamos el botón derecho del raton y damos Properties-Pestaña Runtimes - botón New.


Ahora nos aprece esta ventana, y le decimos que queremos Apache Tomcat 9 o la versión que hayamos instalado Next

y le indicamos la ruta (que estaba en /opt) y seleccionamos un JRE 8 y el botón Finish. Y ya está.



Con lo que ya tenemos nuestro runtime y lo seleccionamos en la pantalla de Project Faces


martes, 21 de febrero de 2017

WS-REST 01.Instalar Tomcat

El primer paso es instalar Tomcat. Suponemos que estamos en Ubuntu 16.

Los pasos son los siguientes:

1. Ir a la página de descarga de la versión 9 por ejemplo y nos descargamos en formato tar.gz



2. Ampliamos los permisos de los permisos de /opt a todas sus subcarpetas:
 
    sudo chmod -R +r+x /opt

3. Vamos a nuestra carpeta de descargas y copiamos el fichero descargado a /opt

4.
Vamos a /opt y lo descomprimimos
   cd /opt
  sudo tar -xvf nombre_del_fichero