openxava / documentación / Spring Boot

Spring Boot es una herramienta que hace que el desarrollo de aplicaciones web y microservicios con Spring Framework sea más rápido y fácil.
En esta publicación integraremos OpenXava en una aplicación Spring Boot simple con servicios Rest y JPA para aprovechar la vista generada automáticamente por OpenXava. Trabajaremos con nuestro proyecto ejemplar y lo importaremos en Spring Tool Suite 4 for Eclipse. Así mismo vas a necesitar OpenXava Studio y MySQL(usaremos MySQL8 en este ejemplo). Al final levantaremos la aplicación en un servidor Tomcat 9.

Importar y configurar proyecto en Spring Tool Suite 4

Descarga el proyecto como archivo comprimido zip y descomprimelo.

Selecciona Import projects desde la vista de Package Explorer o bien File > Import y selecciona Existing Maven Projects.

Busca la carpeta donde has descomprimido el proyecto y seleccionalo.

Abre application.properties ubicado en src/main/resources, adáptalo a tu base de datos MySQL con tu URL, username, password y dialecto, recuerda tener levantado la base de datos MySQL.

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect

Crea algunos registros manualmente en MySQL, por ejemplo:

INSERT INTO `yourdatabase`.`tutorials` (`id`, `description`, `published`, `title`) 
VALUES ('1', 'description 1', 0, 'title 1');

Comprueba que los servicios funcionen correctamente ingresando a http://localhost:8080/api/tutorials

Crear y configurar proyecto en OpenXava

Lo que necesitamos ahora es copiar los archivos de configuración que genera OpenXava al crear un proyecto nuevo al proyecto Spring Boot, para esto el proyecto debe tener las mismas configuraciones que el proyecto Spring Boot.

Crea un nuevo proyecto OpenXava con OpenXava Studio.

getting-started_es020.png

Project name: openxava-spring-boot-example

Group id: com.example

Agrega el dialecto de MySQL8 en el archivo persistence.xml ubicado en src/main/resources/META-INF.

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>

Configura el archivo context.xml de la carpeta src/main/webapp/META-INF, comenta el resource de HSQLDB, usa el de MySQL y configura la conexión a la base de datos usando tu URL, usuario y contraseña.

Reemplazar application.properties y copiar archivos al proyecto Spring Boot

Ahora volvemos al proyecto en Spring Tool Suite 4 y procedemos a integrar OpenXava en una aplicación Spring Boot, hay varias maneras de hacerlas, nosotros usaremos una. Primero reemplaza el archivo application.properties configurándolo manualmente creando una clase @Configuration.
Para esto crea una clase llamada AppConfig en el paquete com.example.openxava.spring.boot.example, dentro de dataSource() define las configuraciones de conexión a la base de datos (url, usuario, contraseña), las entidades y repositorios a leer, por ejemplo:
package com.example.openxava.spring.boot.example;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableJpaRepositories("com.example.openxava.spring.boot.example.repository")
@EnableTransactionManagement
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/yourdatabase?useSSL=false");
        dataSource.setUsername("root");
        dataSource.setPassword("");
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactory.setDataSource(dataSource());
        entityManagerFactory.setPackagesToScan("com.example.openxava.spring.boot.example.model");
        entityManagerFactory.setPersistenceUnitName("com.example.openxava.spring.boot.example.model");
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.MYSQL);
        vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL8Dialect");
        entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
        entityManagerFactory.setJpaProperties(hibernateProperties());
        return entityManagerFactory;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
        return properties;
    }

}
Elimina el archivo application.properties y prueba que los servicios sigan funcionando correctamente ingresando a http://localhost:8080/api/tutorials
Añade extends SpringBootServletInitializer en OpenxavaSpringBootExampleApplication ubicado en el paquete com.example.openxava.spring.boot.example:
@SpringBootApplication
public class OpenxavaSpringBootExampleApplication extends SpringBootServletInitializer {

	public static void main(String[] args) throws Exception {
		SpringApplication.run(OpenxavaSpringBootExampleApplication.class, args);

	}
}
Ahora configura el pom.xml agregando el packaging war, la dependencia de OpenXava (puedes usar la última versión disponible, desde 7.1.1) El finalName es opcional pero lo usaremos en este ejemplo:
<packaging>war</packaging>

<dependencies> ... <dependency> <groupId>org.openxava</groupId> <artifactId>openxava</artifactId> <version>7.1.1</version> </dependency> </dependencies>

<build> <finalName>openxavaspringbootexample</finalName> </build>
Por último, copia los siguientes archivos y carpetas del proyecto OpenXava al proyecto Spring Boot bajo la misma ruta:

Debería quedar con estos cambios:

Ejecutar aplicación

Recuerda tener configurado JAVA_HOME y hacer los siguientes pasos antes de ejecutar la aplicación:

Copia el archivo openxavaspringbootexample.war de la carpeta target a la carpeta webapp donde tienes instalado Tomcat 9 y ejecuta startup.bat desde la carpeta bin

Abre el navegador e ingresa al siguiente url para abrir la aplicación OpenXava (inicia sesión con admin/admin si no has hecho el paso opcional):
http://localhost:8080/openxavaspringbootexample

Aprovechando las vistas que genera OpenXava con las entidades del proyecto ya puedes realizar operaciones CRUD.

Comprueba que los servicios del proyecto Spring Boot estén funcionando: http://localhost:8080/openxavaspringbootexample/api/tutorials

Verás que en vez de devolver un json, está devolviendo un xml, esto es debido al bug de la librería JasperReports que trae OpenXava, lo resolveremos momentáneamente en este ejemplo excluyendo una dependencia de esa librería, que no es recomendable hacerlo en producción:

<dependency>
    <groupId>org.openxava</groupId>
    <artifactId>openxava</artifactId>
    <version>7.1.1</version>
    <exclusions>
        <exclusion>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Si deseas quitar "openxavaspringbootexample" del url, simplemente renombra el archivo openxavaspringbootexample.war a ROOT.war ubicado en la carpeta de webapps, luego con el url http://localhost:8080 ingresas a la aplicación OpenXava y con http://localhost:8080/api/tutorials a los servicios.