openxava / documentación / Problemas

Tabla de contenidos

Problemas
Liferay cierra la sesión después de 30 minutos de trabajo
UTF-8 characters are not processed correctly
La salida de bitácora (log) no se muestra con Liferay 5.1
Degradación del rendimiento cuando se trabaja mucho tiempo en la misma página con Liferay
Pérdida de JNDI en Liferay
Generar PDF no funciona

Liferay cierra la sesión después de 30 minutos de trabajo

Usando OX3.1 o superior no se produce recarga de página (gracias a AJAX), por eso si el usuario está trabajando 30 minutos en el mismo módulo Liferay piensa que no ha tocado la aplicación en todo ese tiempo, y muestra un mensaje de fin de sesión.
Es fácil configurar Liferay para evitar este comportamiento tan inconveniente.
Primero, pon la caducidad de la sesión a 5 minutos. Edita el archivo web.xml (en webapps/ROOT/WEB-INF para Tomcat):
<session-config>
    <session-timeout>5</session-timeout>
</session-config>
Edita (o crea si todavía no existe) el archivo webapps/ROOT/WEB-INF/classes/portal-ext.properties, añadiendo las siguientes propiedades:
session.timeout=5
session.timeout.warning=1
session.timeout.auto.extend=true
De esta manera la caducidad de la sesión es de solo 5 minutos, pero es extendida automáticamente (sin preguntar nada al usuario) mientras que el navegador tenga el Liferay abierto.
Advertencia: Por causa de un bug de Liferay esta configuración necesita un Liferay 4.4.1 o superior.

UTF-8 characters are not processed correctly

OpenXava tiene soporte completo para UTF-8 o cualquier otro conjunto de caracteres que quieras desde la versión 3.1. Coge el valor de la propiedad Java file.encoding y la usa como codificación para las peticiones y respuestas web.
Si tu aplicación OX no muestra o introduce correctamente caracteres UTF-8, prueba poner -Djava.encoding=UTF-8 como opción Java al arrancar tu servidor de aplicaciones.

La salida de bitácora (log) no se muestra con Liferay 5.1

Simplemente añade un archivo llamado logging.properties a la carpeta properties de tu proyecto. El registro puede estar vacío.
La causa es que si el Liferay 5.1 no encuentra este archivo lo crea por ti, y está configurado por defecto para no producir salida en el log.

Degradación del rendimiento cuando se trabaja mucho tiempo en la misma página con Liferay

Este no es un problema de OpenXava. Es un problema del JavaScript incluido en Liferay. Realmente afecta a cualquier aplicación AJAX que cambie el HTML sin recargar la página durante algún tiempo.
Afortunadamente es fácil de arreglar. Edita el archivo livequery.js de la carpeta webapps/ROOT/html/js/jquery en tu Liferay. Busca la función registerPlugin y comenta su contenido. Tal y como sigue:
registerPlugin: function() {
    /* Anulado, porque produce una degracación
     * del rendimiento con OpenXava,
     * realmente con cualquier aplicación AJAX que use
     * una página HTML única
    $.each( arguments, function(i,n) {
        // Short-circuit if the method doesn't exist
        if (!$.fn[n]) return;
 
        // Save a reference to the original method
        var old = $.fn[n];
 
        // Create a new method
        $.fn[n] = function() {
            // Call the original method
            var r = old.apply(this, arguments);
 
            // Request a run of the Live Queries
            $.livequery.run();
 
            // Return the original methods result
            return r;
        }
    });
    */
},
Si está usando Liferay 5.2.x ya has terminado el trabajo, simplemente refresca el navegador y todo tiene que funcionar de perlas.
Si está usando Liferay 5.1.x edita el archivo portal-ext.properties de la carpeta webapps/ROOT/WEB-INF/classes en tu Liferay, y añade la siguiente entrada:
javascript.fast.load=false
Después, reinicia tu Liferay. Ahora todo funcionará rápido todo el tiempo.

Pérdida de JNDI en Liferay

Con la aplicación funcionando en el portal, si al cambiar el esquema por código nos ocurre este error:
Caused by: org.hibernate.engine.jndi.JndiException: Unable to lookup JNDI name [java:comp/env/jdbc/DataSource]
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:117)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:115)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:56)
    ... 286 more
Caused by: javax.naming.NameNotFoundException: El nombre java:comp/env/jdbc/DataSource no este asociado a este contexto
    at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:135)
    at com.liferay.portal.security.pacl.jndi.SchemeAwareContextWrapper.lookup(SchemeAwareContextWrapper.java:193)
    at javax.naming.InitialContext.lookup(InitialContext.java:396)
    at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:114)
Se soluciona añadiendo en el fichero portal-ext.properties de la carpeta webapps/ROOT/WEB-INF/classes de tu liferay la siguiente línea:
portal.security.manager.strategy=none

Generar PDF no funciona

Suele ser porque el bloqueador de ventanas emergentes está activo en tu navegador. Desactívalo o añade tu URL como excepción. A partir de v5.8 la generación PDF funciona incluso con el bloqueador de ventanas emergentes activado.