Buscando artículos sobre "Java"
31-agosto-2016
admin

Crear aplicación a partir de la Base de Datos con Spring Roo

Paso 1: Instalar Spring Roo
– En primer lugar necesitas tener instalado Java y Maven.
– A continuación te descargas Spring Roo de la página oficial.
– Se descomprime en un directorio y se añade al path. En windows seria añadir en el path $ROO_HOME\bin siendo $ROO_HOME el directorio donde lo has descomprimido.
– Para comprobar que se ha instalado correctamente podemos ejecutar directamente en la consola el siguiente comando.
roo quit
Si todo va bien debería mostrarnos el logo de Spring Roo.


Paso 2: Crear un proyecto de Spring Roo
Se puede crear de distintas formas:
– Con el STS se puede crear un proyecto de Spring Roo como tal.
– Con el eclipse también se podría añadiendo el plugin de Spring Roo.
– Y por último también podriamos utilizar directamente la consola para su creación.

De esta forma, los comandos para la creación de un proyecto a partir de una BD Mysql serían:

//Primero se configura la BD de la que luego se hará ingeniería inversa...
jpa setup --database MYSQL --provider HIBERNATE --databaseName nombre_de_mi_esquema --hostName ip_de_mi_mysql --userName mi_usuario --password mi_contraseña
//Luego se puede comprobar si se ha realizaco la conexión bien
database introspect --schema nombre_de_mi_esquema
// si te dice que no encuentra el driver puedes instalarlo así
addon search mysql
//te deberia salir una lista con los drivers que puedes instalar para a continuación
addon install id --searchResultId xx    
//xx sería el codigo del driver mostrado en el listado que saca el anterior comando...
//En mi caso me dió problemas y el de mysql no me lo instaló bien así que lo instale a mano.
//Para ello me lo descargue y lo instalé con el siguiente comando:
osgi start --url file:///C:\\mysql-connector-java-5.1.18.jar
//Ahora ya se puede crear las entidades a partir de la BD.
database reverse engineer --schema nombre_de_mi_esquema --package ~.domain --includeTables "tab_*"

Por último sería añadir el resto del negocio y la presentación. Para ello pongo dos ejemplos: MVC y JSF.

//Usando Spring MVC
web mvc setup
web mvc all --package ~.web
Usando JSF
web jsf setup --implementation --library --theme
web jsf all --package ~.web

Como nota decir que se lía algo con las tablas con clave primaria múltiple (hay que quitar unos errores que salen en los ficheros *.aj que crea).

Puedes probar a ejecutar el proyecto simplemente con la instrucción de manve
mvn clean install jetty:run


Documentación:
Ejemplo de creación de un proyecto con STS. Ver
Ejemplo de creación de un proyecto con el plugin de eclipse para Spring Roo. Ver

25-febrero-2016
admin

Borrado de documentos en Alfresco

Por un lado hay que tener en cuenta que los documentos en alfresco no se borran realmente hasta que el usuario que los ha borrado o el administrador vacia la papelera de reciclaje. Ésta se vacia en la sección User Profile.

Por otro lado se debe tener en cuenta que lo que se hace es un borrado lógico. De tal forma que aunque no podamos verlos desde el interfaz de Alfresco, no se han borrado físicamente del disco. Se mantienen dentro del contentstore en estado huérfano ya que no quedan referencias a él en la base de datos.

Ahora bien, en Alfresco se ejecutan una serie de procesos automáticos de mantenimiento. Se definen en el fichero scheduled-jobs-context.xml que se apoya en el repository.properties para configurarse (localizables ambos en /Alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/). Entre ellos nos encontramos con:

contentStoreCleanerTrigger: es el encargado de lanzar el bean contentStoreCleaner (definido en el content-services-context.xml) que se encarga de borrar los contenidos huérfanos del contentstore. Por defecto se ejecuta a las 4:00 AM cada día (0 0 4 * * ?). El parámetro system.content.orphanProtectDays establece el número mínimo de días que el contenido debe ser huérfano antes de poder eliminarlo, el valor predeterminado es de 14 días. Es decir, el documento permanecera 14 días en estado huérfano en el contentstore hasta que por fin la tarea Cleaner lo pase al contentstore.deleted.

Nota 1: Si la propiedad system.content.eagerOrphanCleanup está a true los documentos se moverán al directorio contentstore.deleted sin necesidad de la ejecución del contentStoreCleaner.

Nota 2: El contentstore.deleted es responsabilidad del administrador de borrarlo para liberar espacio.

Scheduled jobs
Content store configuration

15-enero-2016
admin

Máquinas virtuales de Bitmani para desarrollo web

Bitnami es una biblioteca de aplicaciones de servidor populares y entornos de desarrollo que se pueden instalar con un solo clic. Es tan sencillo como descargarse una máquina virtual ya preparada para VMware o Virtual Box con los servidores que deseemos. Además, luego le puedes ir añadiendo módulos que vayas necesitando.

A continuación se muestra una guía de comandos rápida de uso para montar un servidor Tomcat con java 1.7 y nodejs.

Arrancar y parar Tomcat
-----------------------
	Todos los servicios se arrancan y paran de la siguiente forma:
		sudo /opt/bitnami/ctlscript.sh status
		sudo /opt/bitnami/ctlscript.sh start tomcat
		sudo /opt/bitnami/ctlscript.sh stop tomcat
		sudo /opt/bitnami/ctlscript.sh restart tomcat

Cambiar el teclado inglés
-------------------------
	Por defecto la máquina virtual viene configurada con teclado en inglés. 
	Para cambiarlo sería:
		sudo dpkg-reconfigure keyboard-configuration

Activar SSH
-----------
	Por defecto el servicio ssh viene desactivado. Se puede activar así:
		sudo mv /etc/init/ssh.conf.back /etc/init/ssh.conf
		sudo start ssh

Configuración de red en VMware
------------------------------
	Tarjetas de red con el VMware Bridge Protocol desactivado.
	Tarjetas de red con ip y dns automático.
	Network Adapter de la máquina virtual en modo brighed.
	
Configurar la red manualmente.
------------------------------
    Hay que editar el archivo interfaces, por ejemplo así:

	1- Editamos la interface de la tarjeta de red. En este caso la eth0 
		vi /etc/network/interfaces 
		
		Dentro del archivo debes buscar:
		auto eth0
		iface eth0 inet dhcp
		
		y sustituirlo por lo que corresponda en cada caso:

		auto eth0
		iface eth0 inet static
		address 192.168.1.40
		netmask 255.255.255.0
		gateway 192.168.1.1
		network 192.168.1.0
		broadcast 192.168.1.255
	
    2- Ahora editamos los DNS:
		vi /etc/resolv.conf
		
		nameserver = 8.8.8.8
		nameserver = 8.8.4.4 
	
	3- Por ultimo reiniciamos el servicio de red:
		/etc/init.d/networking restart 
		
Cambiar la jdk
--------------
	Descargar la deseada, en este caso queremos pasar de la 1.8 que nos traia 
	la máquina a la 1.7 así que descargamos al 1.7 de aquí
		http://www.oracle.com/technetwork/es/java/javase/downloads/jre7-downloads-1880261.html
		
	Lo más rápido es reemplazar el directorio /opt/bitnami/java por el nuevo. 
	Se puede hacer por consola tal que así:
		sudo mv /opt/bitnami/java /opt/bitnami/java8
		sudo mv /tmp/java /opt/bitnami/java
		sudo chown -R root /opt/bitnami/java	  (cambiar el usuario)
		sudo chown -R :root /opt/bitnami/java	(Cambiar el grupo)
		sudo chmod -R 777 /opt/bitnami/java
	
Añadir un módulo nuevo (Ej: nodejs)
-----------------------------------
	Descargarse de la página el *.run 
		https://bitnami.com/stack/nodejs/installer#linux
	Se puede utilizar para ello el comando wget si se quiere.
		wget https://bitnami.com/..................../bitnami-nodejs-5.4.0-0-linux.run
	
	Darle permisos:
		chmod 755 bitnami-nodejs-5.4.0-0-linux.run
		
	Ejecutarlo y seguir los pasos de instalación
		sudo /bitnami-nodejs-5.4.0-0-linux.run

Apagar la máquina virtual
-------------------------
	sudo poweroff


DOC:
https://wiki.bitnami.com/Virtual_Appliances_Quick_Start_Guide


https://bitnami.com/stack/tomcat/virtual-machine

1-marzo-2015
admin

Ver certificados de una dirección https con HttpsURLConnection

Ver HttpsURLConnection

Ejemplo:

...
     URL url = new URL(HTTPS_DIRECCION_WEB);
     HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
     conn.connect();
     Certificate[] certs = conn.getServerCertificates();

     if (conn != null) {
          for (Certificate cert : certs) {
               log.info("Cert Type: " + cert.getType());
               ....
          }
     }
...

28-febrero-2015
admin

Connectar a una BD Open Office (*.odb) usando jdbc

En primer lugar se debe descomprimir el archivo odb. Esto se puede realizar a mano o automatizarlo, a mano podría ser de la siguiente manera:

1. Renombra tu fichero.odb a fichero.zip
2. Extrae su contenido.
3. Ahora tu puedes ver los archivos: backup, data, script, properties en el directorio creado de la BD.
4. Renombra los archivos a: NOMBRE_BD.data, NOMBRE_BD.backup, NOMBRE_BD.script, NOMBRE_BD.properties
5. La cadena de conexión a esa BD sería: jdbc:hsqldb:file:DIRECCION_FISICA_A_LA_BD/NOMBRE_BD

Ejemplo de uso:

...
Class.forName("org.hsqldb.jdbcDriver");
String cadenaConexion = "jdbc:hsqldb:file:DIRECCION_FISICA/NOMBRE_BD";
Connection con =  DriverManager.getConnection(cadenaConexion,"sa","");
Statement statement = con.createStatement();
ResultSet rs = statement.executeQuery("SELECT * FROM tabla");
while (rs.next()) {
   System.out.print("ID: " + rs.getString("ID"));
}
con.close();
...
21-febrero-2015
admin

Descargar un documento de la web con java

Ejemplo usando URLConnection:

import java.net.URL;
import java.net.URLConnection;
import org.springframework.util.FileCopyUtils;
import java.io.File;
import org.apache.commons.io.FileUtils;

...

     URL url = new URL( URL_DEL_DOCUMENTO_A_DESCARGAR );
     URLConnection urlCon = url.openConnection();

     //obtenemos el inputStream y lo convertimos a un array de bytes
     byte[] data = FileCopyUtils.copyToByteArray(urlCon.getInputStream());

     //se vuelca el contenido a un fichero en disco
     File temp = new File("/tmp/" + NOMBRE_FICHERO_PARA_ALMACENARLO);
     FileUtils.writeByteArrayToFile(temp, data); 

...

14-febrero-2015
admin

Consumir webservices bajo Https con Java

Si queremos consumir un WS que corre bajo https podemos realizar lo siguiente:

Paso 1/ Descargar los certificados del servicio

El Keysotre o JKS (Java Key Store) es un repositorio de certificados de seguridad, certificados de autorización o certificados de clave pública, utilizados por ejemplo en el cifrado SSL. Usualmente el JDK contiene un almacén de claves de certificados de autorización (CA) en la ruta jre/lib/security/cacerts. Así mismo el JDK provee una herramienta llamada keytool para manipular el keystore.
Para importar un certificado a nuestro keystore, lo primero que debemos hacer es descargar dicho certificado desde la dirección url del wsdl. Para ello ponemos esa url en un navegador. Al cargar la página podremos comprobar que junto a la barra de direccion saldrá un candado o algo similar (depende del navegador). Al hace click sobre él se nos abrirá un formulario donde se puede ver toda la información referente a los certificados que se usan. Dese esa pantalla se deben exportar (dependiendo del navegador será más o menos complejo encontrar el botón de exportar/copiar en archivo/…).
Se debe exportar en formato X.509 codificado base 64 (.CER)

Paso 2/ Importar el certificado digital a nuestro keystore

Se deben importar los certificados descargados a nuestro almacen de claves. Hay herramientas desde las que se puede hacer de forma bastante cómodo como es Keystore Explorer. Pero sino siempre puedes usar keytool:

keytool -import -keystore "C:\Archivos de programa\Java\jre1.6.0_05\lib\security\cacerts" 
                  -file c:\certificadodescargado.cer -storepass changeit

Paso 3/ Utilización

Ahora al ejecutar nuestra aplicación java al intentar conectar con ese ws localizará los certificados y dejará realizar la conexión. Se le puede indicar donde esta nuestro almacen de certificados así:

System.setProperty("javax.net.ssl.keyStore", "C:\Program Files (x86)\Java\jdk1.6.0_23\jre\lib\security\cacerts");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.setProperty("javax.net.ssl.trustStore", "C:\Program Files (x86)\Java\jdk1.6.0_23\jre\lib\security\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Más info sobre esto

7-febrero-2015
admin

Unable to read TLD “META-INF/tld/tiles-jsp.tld” from JAR file

En una aplicación web J2EE que corría sobre un Tomcat me daba este error:

Unable to read TLD "META-INF/tld/tiles-jsp.tld" from JAR file

Para solucionarlo borré el jsp-api.jar del WAR del proyecto.

Normalmente, jsp-api.jar no debe estar incluido en el WAR de una aplicación porque el servidor de aplicaciones debe tenerlo en su biblioteca común.

1-noviembre-2014
admin

Java Architecture for XML Binding (JAXB)

JAXB te permite almacenar y recuperar datos en memoria en cualquier formato XML, sin la necesidad de implementar un conjunto específico de rutinas de carga y guardado de XML para la estructura de clases del programa.

Vamos a utilizar las interfaces Marshaller y Unmarshaller, responsables de dirigir el proceso de serialización de los contenidos de un objeto de alguna clase de Java a datos XML y viceversa.

Marshalling
La interface Marshaller es la interfaz que define los métodos utilizados para realizar el binding de nuestras clases desde objetos a XML. De esta forma:
1 – Definimos una clase Persona.

@XmlRootElement(name = "Persona")
public class Persona{

    @XmlElement()
    private String nombre;
    @XmlElement()
    private String apellido;
 
    public Persona()
    {
    }
 
    public Persona(String nombre, String apellido)
    {
        this.nombre= nombre;
        this.apellido= apellido;
    }
    …
}

2 – creamos el objeto que pretendemos convertir a xml:

Persona person = new Persona("Manuel", "Perez");

3 – Una vez creado el objeto Marshaller solo resta invocarlo pasándole el objeto a serializar y el flujo donde almacenará el resultado:

JAXBContext context = JAXBContext.newInstance(Person.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
     
FileWriter file = new FileWriter("/temp/Persona.xml");
marshaller.marshal(person, file);

4 –El fichero creado tendrá esta estructura:

< ?xml version="1.0" encoding="UTF-8" standalone="yes"?>
< Persona>
    < nombre>Manuel< /nombre>
    < apellido>Perez< /apellido>
< /Persona>

Unmarshalling
La interface Unarshaller es la interfaz que define los métodos utilizados para realizar el binding de nuestras clases desde XML a objetos. Pasamos directamente al ejemplo:

JAXBContext jc = JAXBContext.newInstance (Persona.class);
Unmarshaller u = jc.createUnmarshaller ();
File f = new File ("/temp/DB.xml");
Persona personadelxml= (Persona)u.unmarshal(f);

Fuente: http://es.wikipedia.org/wiki/JAXB
Documentación

20-octubre-2014
admin

Usar Apache CXF para montar servicios en java

En primer lugar comentar unos conceptos básicos… tenemos dos tipos de servicios web: SOAP y REST.
– SOAP consiste en el intercambio de mensajes envueltos en un XML. El cliente envía un mensaje XML en formato SOAP, dicho mensaje es recibido por el servidor, que desencapsula dicho mensaje en el formato correspondiente (SOAP es multilenguaje, acepta varios lenguajes, entre ellos Java), que recibe los datos, procesa una respuesta y la devuelve.
En Java existe la implementación JAX WS.

– Rest es una implementación posterior. No sólo utiliza un tipo de mensaje HTTP para el intercambio de mensajes, si no que permite más mensajes. Con Rest puedes tener un cliente que envíe mensajes HTTP de tipo GET, PUT, POST y DELETE. Cada mensaje enviará los datos correspondientes asociados hacia el servidor, que, recibirá la petición, la entenderá, y delegará en el método correspondiente. GET sirve para recuperar un dato desde el cliente al servidor, PUT para insertar un dato, POST para enviar información para modificar y DELETE para eliminar información del servidor.
En Java existe la implementación JAX RS.

Una forma muy sencilla de montar nuestros servicios en java es utilizar Apache CXF que se adapta tanto a Jax WS como a Jax RS. Además, se integra muy bien con Spring.
En la documentación hay numerosos ejemplos: Documentación oficial

A continuación un par de ejemplos muy sencillos:

package es.com.disastercode;

import javax.jws.WebService;

@WebService
public interface EjemploService{
    String getTipoCoche(String matricula);
}

Archivo de implementación JAX WS. Para exponer un servicio y publicarlo en un contendor de aplicaciones que soporte JAX-WS. Automáticamente el contenedor se encargará de generar el contrato (WSDL).

package es.com.disastercode;

import javax.jws.WebService;

@WebService(endpointInterface = "es.com.disastercode.EjemploService")
public class EjemploServiceWSImpl implements EjemploService {

    public String getTipoCoche(String matricula) {
        return "Seat Ibiza";
    }
}

Archivo de implementación JAX-RS. Permite realizar lo mismo que antes pero exponiendolo como recursos REST.

package es.com.disastercode;

import javax.jws.WebService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@WebService(endpointInterface = "es.com.disastercode.EjemploService")
@Produces("application/json")
public class EjemploServiceRSImpl implements EjemploService {
       
    @GET
    @Path("/{matricula}")
    public String getTipoCoche(@PathParam("matricula")String matricula) {
        return "Seat Ibiza";
    }
}

Ahora sólo nos faltaría configurar los servicios en Spring. Para ello:
1/ añadir al web.xml:

        < context-param>
                < param-name>contextConfigLocation< /param-name>
                < param-value>WEB-INF/appCtx.xml< /param-value>
        < /context-param>

        < listener>
                < listener-class>
                        org.springframework.web.context.ContextLoaderListener
                < /listener-class>
        < /listener>

        < servlet>
                < servlet-name>CXFServlet
                < servlet-class>
                        org.apache.cxf.transport.servlet.CXFServlet
                < /servlet-class>
                < load-on-startup>1
        < /servlet>

        < servlet-mapping>
                CXFServlet
                /*
        < /servlet-mapping>

2/ añadir la configuración de JAX WS a spring.

< beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	< import resource="classpath:META-INF/cxf/cxf.xml" />
	< import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
        < import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

	< bean id="ejemploServiceController"
		class="es.com.disastercode.EjemploServiceWSImpl">
	< /bean>

	< jaxws:endpoint id="ejemploService" implementor="#ejemploServiceController"
		address="/ws/exps">
        < jaxws:dataBinding>
        	
            < /bean>
        < /jaxws:dataBinding>
    < /jaxws:endpoint>     
< /beans>

3/ añadir la configuración de JAX RS a spring.

< beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:jaxrs="http://cxf.apache.org/jaxrs"
      xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
         http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

	< import resource="classpath:META-INF/cxf/cxf.xml" />
	< import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
        < import resource="classpath*:META-INF/cxf/cxf-extension-*.xml" />
    

	< bean id="ejemploServiceRestController"
		class="es.com.disastercode.EjemploServiceRSImpl">
	< /bean>


    < jaxrs:server id="ejemploServiceRest" address="/rest">
        < jaxrs:serviceBeans>
            < ref bean="ejemploServiceRestController" />
        < /jaxrs:serviceBeans>
        
         
		< jaxrs:providers>
		 < ref bean="jsonProvider"/>
		< /jaxrs:providers>
		 
		< jaxrs:features>
 		< /jaxrs:features>
 		
    < /jaxrs:server>

    < bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
< /beans>
Páginas:«1234»

Categorias

Linkedin