====== FAQS - FundeWeb 2.0 ====== — //[[juanmiguelbg@um.es|JUAN MIGUEL BERNAL GONZALEZ]] 2014/03/24 09:22// ---- ==== Versión Tortoise para Fundeweb 2.x==== En los equipos a partir de Windows 7, la versión del cliente SVN Tortoise que se distribuye con Novell no funciona correctamente, por lo que deberemos proceder manualmente a descargarlo desde su página web. Es importante destacar que la versión compatibles con el entorno Fundeweb es la **1.6.16 ** que se puede descargar en este [[http://sourceforge.net/projects/tortoisesvn/files/1.6.16/Application/ | enlace]] **Importante**: No se debe instalar ninguna versión de tortoise superior a la 1.6.x ya que no son compatibles con el cliente svn que tiene Fundeweb 2.x y por lo tanto no serán reconocidos los estados svn. ---- ==== Autocomplete sin ajaxStatus (mensaje de espera) ==== Si tenemos el componente en nuestra aplicación y no queremos que nos salga un mensaje de espera cuando hace la llamada ajax para calcular la lista de elementos a seleccionar deberemos introducir dentro del componente el siguiente código: Esta anotación intercepta el comportamiento ajax normal del componente autocomplete y junto a la propiedad **global="false** evita que se lance el evento ajaxStatus, lo que se traduce en que no nos saldrá el cartel de espera. El código de ejemplo de un autocomplete con esta funcionalidad sería el siguiente: ** //Autor: pedrody@um.es// ** ---- ==== Error en relaciones ManyToMany y CheckBoxMenu ==== El componente CheckBoxMenu, y por lo general, cualquier checkbox que dependa de relaciones **many to many**, presenta un problema con jsf por el cual se pierde la sesión de Hibernate al intentar recuperar la relación (Lazy). La primera vez la carga es correcta, pero al refrescar el componente se produce el error. Para resolver este error debemos seguir estos pasos: - Cambiar los "Set" de los bean de entidad por List (y ArrayList ). - Introducir el siguiente código en el fichero .xhtml de la página, justo dentro del componente que nos da el problema. Un ejemplo de código completo sería el siguiente ** //Autor: juanmiguelbg@um.es// ** ---- ==== Deshabilitar cacheado por defecto en Hibernate ==== Para deshabilitar el chacheado de queries por defecto, debemos añadir la siguiente propiedad al fichero **persistence.xml**. ** //Autor: pedrody@um.es// ** ---- ==== Como cargar Javascript o CSS con JSF2 ==== Para poder cargar ficheros Javascript o CSS con JSF 2, tenemos que utilizar las etiquetas //// y ////. Dentro del módulo WEB, los ficheros cargados con estas etiquetas, tienen que tener como carpeta inicial la carpeta //resources//, ya sea en la carpeta //src/main/webapp// o en //src/main/web_resources//. Si los cargamos desde un fichero JAR, los ficheros cargados con estas etiquetas, tienen que tener como carpeta inicial la carpeta //resources//, y esta a su vez dentro de la carpeta //META-INF// de la carpeta //src/main/resources///. Estas etiquetas tienen las siguientes propiedades: * //library//: pondremos el nombre de la carpeta inicial que hay después de la carpeta //resources// si existe, sino existe, no se pone nada. * //name//: pondremos el nombre del fichero junto con la extensión, y además el resto de la ruta a partir del //library//, si esta tiene más profundidad. Veamos un ejemplo, donde tenemos los ficheros en las rutas //resources/fundeweb/primefaces/js/locales.js//, //resources/css/theme.css// y //resources/fundeweb/js/fundeweb.js//: <h:outputText value="#{messages['application.title']}"/> ... ** //Autor: juanmiguelbg@um.es// ** ---- ==== Internacionalización del Componente Calendar de Primefaces ==== El caso más claro es el del componente //[[http://www.primefaces.org/showcase/ui/input/calendar.xhtml|]]// donde aparecen los nombres de los meses, días y ciertos botones más, que no se pueden internacionalizar de la forma estándar de JSF. Para eso Primefaces permite internacionalizar el texto de Javascript mediante el componente //Primefaces.locales// indexado por el local apropiado. En FundeWeb 2 hemos añadido la traducción al castellano, para poder utilizarlo, tenemos que tener la dependencia //FundeWeb JSF2 Tags// en su versión 2.0.2 como mínimo, y añadir en la plantilla de la página a utilizar (por defecto es ///layout/template.xhtml//) dentro de la etiqueta //// la importación del Javascript //locales.js//. Ejemplo: <h:outputText value="#{messages['application.title']}"/> ... ** //Autor: juanmiguelbg@um.es// ** ---- ==== Informar al usuario para que habilite el Javascript en la aplicación ==== Actualmente es sencillo bloquear el Javascript que ejecutan las páginas web. Pero la mayoría de las aplicaciones lo necesitan para su correcto funcionamiento. Este es el caso de las aplicaciones FundeWeb y del Applet de Firma Electrónica. Para informar al usuario que tiene que habilitar el Javascript en la aplicación tenemos que realizar los siguientes pasos: * Crear el fichero //no_script.xhtml// dentro de la carpeta //webapp/layout// del módulo Web, con el siguiente contenido: * Editar los ficheros //template.xhtml// y //template_login.xhtml// y añadir justo delante del componente con //id="messagesGlobal"// lo siguiente: * Editar el fichero //messages_en.properties// y añadir las siguientes propiedades: #---- No script ------------------------------------ value.attention=Attention noscript.message=The page you are viewing requires JavaScript to function properly. If you have intentionally disabled, please re-activate it. * Editar el fichero //messages_es.properties// y añadir las siguientes propiedades: #---- No script ------------------------------------ value.attention=Atenci\U00F3n noscript.message=La p\U00E1gina que estas viendo necesita JavaScript para su correcto funcionamiento. Si lo has deshabilitado intencionadamente, por favor vuelve a activarlo. Valido también para aplicaciones FundeWeb 1.x. ** //Autor: juanmiguelbg@um.es// ** ---- ==== Problemas con el DataTable con carga Lazy y las Columnas Seleccionables ==== Parece que cuando utilizamos un //// de Primefaces con carga //Lazy// (páginada) junto con el componente //// la importación del Javascript //primefaces_fix.js//. Ejemplo: <h:outputText value="#{messages['application.title']}"/> ... En la definición del ////, tenemos que añadir para que eventos Ajax de la tabla, tiene que recalcularse las columnas a visualizar. El recálculo se realiza llamando a la función Javascritp //updateToggles()//, a la que se le pasa como parámetro, el //widgetVar// del componente //// definido en el ////:
...
En este caso llamamos a la función Javascript //updateToggles()// cuando se lancen los eventos Ajax //sort// (ordenación), //filter// //filtrado// y //page// (paginación). Este //workaround// se puede utilizar al menos en las versiones de Primefaces 5.0.15 y anteriores, y 5.1.6 y anteriores. ** //Autor: juanmiguelbg@um.es// ** ---- ==== Los p:dialog no aparecen centrados verticalmente en patallas con scroll ==== Primefaces calcula el centro de la pantalla usando jQuery, cuando tenemos una pantalla con scroll jQuery calcula el centro de la parte visible, pero si tenemos una pantalla creada a partir de incluir varios xhtml puede surgir el problema de que no nos aparezca en el centro y aparezca abajo en la pantalla, o sólo aparezca el bloqueo y no veamos el dialog. Esto se produce cuando incluimos en los ficheros xhtml esta cabecera: En los proyectos fundeweb esta cabecera ya se incluye en la plantilla por defecto, por lo que no debería incluirse en ningún xhtml más. En caso de hacerlo uno de los daños colaterales que produce es que jQuery no funcione bien y no recalcule la posición central de la pantalla correctamente, en vez de calcularla sobre la parte visible por el navegador la calcula sobre toda la página. ** //Autor: pedrody@um.es// ** ---- ==== Uso de DBLinks ==== Si en la base de datos a la que accede nuestro proyecto existen dblinks deberemos cambiar el controlador jdbc en la que tenemos configurado el datasouce tanto en local como en el resto de entornos. Para ello en local deberemos indicar cuando creamos el datasource que el driver a utilizar es el que no es XA. {{ :fdw2.0:fundeweb2.0:faq:datasource1.png |}} Adicionalmente tendremos que avisar a sistemas que configuren este mismo driver en los servidores de desarrollo, test y producción. ** //Autor: pedrody@um.es// ** ---- ==== La selección múltiple de Eclipse no funciona correctamente ==== Debido a un bug de Eclipse, cuando seleccionamos varios ficheros a la vez, pese a que visualmente aparecen marcados como seleccionados, internamente no están todos, sino un subconjuto de los mismos. Por lo tanto es importante saber que cuando vayamos a hacer alguna operación con múltiples ficheros es mejor hacerla de uno en uno o comprobar los que finalmente no han sido seleccionados para repetir la operación. Este bug se solventará en versiones posteriores de Fundeweb. ** //Autor: pedrody@um.es// ** ---- ==== XAER_NOTA : The XID is not valid ==== Si gestionais múltiples transacciones y os aparece el siguiente error: Caused by: java.sql.SQLException: Unexpected exception while enlisting XAConnection java.sql.SQLException: XA error: XAResource.XAER_NOTA start() failed on resource 'Rrhh DataSource_fundeweb': XAER_NOTA : The XID is not valid oracle.jdbc.xa.OracleXAException at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1110) at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:240) at weblogic.jdbc.jta.DataSource.start(DataSource.java:829) Configurar vuestro servidor weblogic como se indica en la siguiente url:\\ http://weblogicissuesolutions.blogspot.com.es/2011/06/resolving-xaernota-xid-is-not-valid.html \\ ** //Autor: jferrer@um.es// ** ---- ==== Usando Jira desde Eclipse ==== El **Eclipse de FundeWEB** lleva instalado el **plugin oficial de Jira** de Atlassian (al escribir ésto la v3.2.2) para [[https://eclipse.org/mylyn/|Mylyn]], de modo que puedes [[https://confluence.atlassian.com/display/IDEPLUGIN/Working+with+JIRA+Issues+in+Eclipse|añadir el Jira de ATICA]], **indicando tu usuario y clave de Jira (marcando la casilla "Save")**, y podrás **usar Jira sin salir de Eclipse**, aprovechando funcionalidades del pluging de Jira para Eclipse, como puede ser el "**contador de tiempo trabajado**" en una tarea o la "identificación de todas las clases" q has modificado (ficheros). En el proyecto Nexus-C (Sala PCI, Juanma Escobar - jmescobar@um.es) lo están usando y de momento están contentos. --- //[[juanlu@um.es|Juan Luis Serradilla Amarilla]] 2015/04/27// ---- ==== Problemas de Repetición de Elementos en Consulta Paginadas ==== A veces puede ocurrir que con consultas paginadas, se repiten elementos en las páginas, y a veces, faltan elementos que si están en la consulta sin paginar. Este es un problema que se produce al no especificar una ordenación mediante una clave que sea única en la consulta. Si no se tiene una clave que sea única para la ordenación, se puede utilizar la pseudo-columna //rowid//, que Hibernate lo traduce como una función sin parámetros que devuelve un //long//. registerFunction( "rowid", new NoArgSQLFunction("rowid", Hibernate.LONG, false) ); === Bibliografía === * [[http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html|On ROWNUM and Limiting Results]] * [[https://ronfrancis.wordpress.com/2007/10/16/dont-forget-an-order-by-for-pagination-queries/|Don’t forget an "order by" for pagination queries]] --- //[[juanmiguelbg@um.es|JUAN MIGUEL BERNAL GONZALEZ]] 2015/12/16 17:12// ---- ==== Como iniciar una nueva transacción al llamar a otro método del mismo EJB ==== En algunas ocasiones ocurre, que en un EJB, llamamos a métodos del mismo EJB, que tienen la anotación //@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)//, que indica que se cree una nueva transacción. Pero, no se crea ninguna transacción. Para solventar este problema tenemos 3 opciones: 1.- Inyectar el propio EJB, dentro de si mismo EJB, e invocar el método que crea la nueva transacción, sobre la instancia inyectada (que en el ejemplo es //self//). @LocalBean @Stateless @Name( "cleanupControl" ) public class CleanupControl { @In( value="cleanupControl", create = true ) private CleanupControl self; public void cleanEntities() { self.delete(); } @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) public void delete() { // ... } } 2.- Inyectar el contexto de sesión, y hacer la invocación del método que crea la nueva transacción, a través de él. @LocalBean @Stateless @Name( "cleanupControl" ) public class CleanupControl { @Resource private SessionContext ctx; public void cleanEntities() { ctx.getBusinessObject(getClass()).delete(); } @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) public void delete() { // ... } } 3.- Crear un nuevo EJB que contenga el método que crea la nueva transacción. @LocalBean @Stateless @Name( "cleanupControl" ) public class CleanupControl { @In( create = true ) private CleanupControlAux cleanupControlAux; public void cleanEntities() { cleanupControlAux.delete(); } } @LocalBean @Stateless @Name( "cleanupControlAux" ) public class CleanupControlAux { @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) public void delete() { // ... } } === Bibliografía === * [[http://blog.exxeta.com/2016/04/05/start-new-transaction-inside-single-ejb-2/|How to start a new transaction inside a single EJB]] --- //[[juanmiguelbg@um.es|JUAN MIGUEL BERNAL GONZALEZ]] 2016/09/26 10:40// ==== Como solucionar el error: Error with publish task 'SplitsrcTargetPreparation' ==== Para solucionar el error //Error with publish task 'SplitsrcTargetPreparation'//, tenemos que realizar los siguientes pasos: * Ejecutar la tarea //ANT maven.project.clean//. * En Eclipse vamos a //Project --> Clean//. --- //[[juanmiguel.bernal@ticarum.es|JUAN MIGUEL BERNAL GONZALEZ]] 2016/11/18 14:13// ---- ==== Subida de Ficheros con PrimeFaces y Codificación de Parámetros de Formulario ==== En algunas ocasiones, utilizamos el mismo formulario para realizar la subida de ficheros con [[https://www.primefaces.org/showcase/ui/file/upload/basic.xhtml|el componente de PrimeFaces ]] y enviar campos de formulario. Para poder usar ese componente, el formulario tiene que tener el atributo //enctype// con valor //multipart/form-data//. Si os pasa que al realizar un evento AJAX y repintar algún campo (o el formulario entero) os aparecen los valores con problemas de codificación, la solución es la siguiente: * Comprobar que la versión de la librería [[https://archiva.um.es/archiva/#artifact~internal/es.um.atica.fundeweb/fundeweb-seam-components|FundeWeb Seam Components sea la 2.0.41 o superior]]. * Por defecto, se ha añadido que el juego de caracteres para los parámetros de formulario sea //UTF-8//, cuando no se especifique en la petición. Recordad que es el navegador el que realiza la petición. Si siguen saliendo mal los caracteres, se puede cambiar esta codificación en el fichero //components.xml//. Por ejemplo, establecerla con //ISO-8859-1//: ... ... Recordad que esta codificación se toma siempre y cuando en la petición no venga especificada ninguna. --- //[[juanmiguel.bernal@ticarum.es|JUAN MIGUEL BERNAL GONZALEZ]] 2017/03/28 14:16// ---- ==== MAVEN: Filtrado de Ficheros con Codificación ISO en Proyectos con Codificación UTF-8 ==== Cuando mediante //Maven// queremos filtrar ficheros de propiedades Java (que el estándar indica que tienen que tener codificación //ISO-8859-1//) y en el proyecto tenemos configurado que la codificación del los ficheros de código fuente a //UTF-8//. Al realizarse el filtrado, la codificación del fichero cambiará a //UTF-8//, provocando errores de codificación al mostrar el texto. Para solucionar este problema, tenemos que añadir una ejecución adicional al plugin //maven-resources-plugin//, donde indicamos que los ficheros incluidos hay que tratarlos con codificación //ISO-8859-1//. Los ficheros incluidos en esta nueva ejecución, hay que sacarlos del sistema normal de filtrado de ficheros de recursos. En el ejemplo utilizamos los ficheros //messages_es.properties// y //messages_en.properties//. ... ... ... org.apache.maven.plugins maven-resources-plugin filter-iso-properties-files process-resources copy-resources ISO-8859-1 src/main/resources ${project.build.outputDirectory} true messages_es.properties messages_en.properties src/main/filters/filtro-${entorno}.properties src/main/resources src/main/resources META-INF/persistence.xml components.properties log4j.xml true ... ... Para poder ver la codificación del proyecto, abrimos el archivo POM principal del proyecto y hacemos seleccionamos en la pestaña //Efective pom//, una vez que aparezca el fichero actualizado en el editor, buscamos la propiedad ////, esta contendrá la codificación que se utiliza para el código fuente del proyecto. Si la codificación de esa propiedad es //ISO-8859-1//, no tendréis el problema y no será necesaria que hagáis las modificaciones de esta FAQ. --- //[[juanmiguel.bernal@ticarum.es|JUAN MIGUEL BERNAL GONZALEZ]] 2017/03/28 14:16// ---- ==== SSL/TLS Verificación de Nombre de Host con Certificados Wildcard ==== Puede ocurrir que cuando accedamos a servicios Web externos con cifrado de conexión con SLL/TLS, el certificado del otro punto sea _wildcard_, con lo que la negociación de la conexión se rompe con la excepción: failed hostname verification check. Certificate contained *.redsara.es but check expected se-face-webservice.redsara.es Como vemos el certificado esta firmado para el dominio //*.redsara.es//, es decir, un dominio //wildcard// (por el * al inicio). Por defecto, Weblogic, verifica el nombre completo por lo que para el //*.redsara.es// no es lo mismo que //se-face-webservice.redsara.es//. Para que se acepten este tipo de certificados, tenemos que cambiar la configuración de Weblogic para que acepte la verificación de dominios en certificados //wildcard//. Para la configuración en local, podemos hacerlo desde la consola de administración: * [[https://docs.oracle.com/middleware/12213/wls/SECMG/hostname_verifier.htm#SECMG573|Weblogic 12.2 - Using the Wildcarded Host Name Verifier]] * [[https://docs.oracle.com/middleware/12213/wls/WLACH/taskhelp/security/ConfigureACustomHostNameVerifier.html|Weblogic 12.2 - Configure a custom host name verifier]] Hay que usar la clase "weblogic.security.utils.SSLWLSWildcardHostnameVerifier". Para la configuración en otros entornos, tenéis que poner un JIRA con los siguientes datos: * Proyecto: //DJ-AT-MIDDLEWARE WEB (MIDWEB)// * Tipo de Incidencia: //Petición de Servicio// * Componente: //SSL// * Resumen: Activar la validación de Host con Certificados Wildcard * Descripción: Necesitamos activar en los nodos manejados, donde esta desplegada la aplicación _MI-APLICACION_, activar la validación de Host con Certificados Wildcard para los entornos de: desarrollo, pre-producción y producción. * Etiquetas: el nombre del grupo (en mayúsculas), de la aplicación (en mayúsculas) y la etiqueta SSL --- //[[juanmiguel.bernal@ticarum.es|JUAN MIGUEL BERNAL GONZALEZ]] 2018/01/11 09:00// ---- ==== Diálogos modales siempre visibles en la ventana ==== Si el scroll vertical de la pantalla que estamos visualizando es muy grande, a veces ocurre que al abrir un diálogo modal el formulario se bloquea, mostrándose todo más oscuro, pero sin verse el diálogo modal, ya que este no está bien posicionado. Para evitar este problema, y que los diálogos modales siempre se visualicen en la misma posición de la ventana del navegador, puede usarse el atributo ''position="top"'' en el elemento **p:dialog**. Con esta opción siempre se verá en la parte superior de la ventana, lo cual es efectivo, pero poco estético. Para corregirlo, pueden crearse algunos estilos que mejoren el resultado: .ui-dialogo-modal { margin-top: 5%; min-height: calc(107px + 5%); max-height: calc(100% - 10%); } .ui-dialogo-modal > .ui-dialog-content { max-height: calc(100% - 107px); overflow: auto; } .ui-dialogo-modal > .ui-dialog-titlebar { min-height: 57px; } .ui-dialogo-modal > .ui-dialog-footer { min-height: 43px; } Y haciendo que el elemento **p:dialog** tenga el ''styleclass="ui-dialogo-modal"''. --- //[[pablo.perez@ticarum.es|PABLO PEREZ MERINO]] 2019/06/01 09:00// ==== BLOB y DISTINCT no funcionan juntos ==== Las entidades con propiedades de tipo BLOB (@Lob), no pueden usarse en selects de tipo DISTINCT. Si se intenta da este error: //"tipos de dato inconsistentes: se esperaba - se ha obtenido BLOB"// --- //[[alvaro.martinez@ticarum.es|ÁLVARO MARTÍNEZ HERNÁNDEZ]] 2019/07/11 10:40// ==== Aplicaciones bajo el mismo dominio, pero en servidor diferente ==== La solución es que en las aplicaciones que se vayan migrando al nuevo servidor añadan en el fichero //weblogic-application.xml// lo siguiente: /_contexto_applicacion_ [[https://www.ateam-oracle.com/wls-session-cookie-overriding-in-an-oamsso-enabled-environment|WLS Session Cookie Overriding in an OAM/SSO Enabled Environment]]\\ [[https://docs.oracle.com/cd/E24329_01/web.1211/e24368/app_xml.htm#WLPRG389|weblogic-application.xml Enterprise Application Deployment Descriptor Elements]]\\ [[https://docs.oracle.com/cd/E24329_01/web.1211/e21049/weblogic_xml.htm#WBAPP587|weblogic.xml Deployment Descriptor Elements - ]]\\ --- //[[juanmiguel.bernal@ticarum.es|JUAN MIGUEL BERNAL GONZALEZ]] 23/01/2020 10:24// ==== DataTable de PrimeFaces con Filtrado y Paginación (NO LAZY) saca Paginas con Registros en Blanco ==== El escenario es el siguiente: * Tenemos un //DataTable// de //PrimeFaces// con filtrado y paginación no //lazy//. {{ :fdw2.0:fundeweb2.0:faq:datatable.png?500 |DataTable PrimeFaces}} * Filtramos por una columna y obtenemos el resultado del filtrado. {{ :fdw2.0:fundeweb2.0:faq:datatable-filtered.png?500 |DataTable PrimeFaces filtrada}} * Borramos el filtrado anterior y obtenemos el resultado del filtrado. {{ :fdw2.0:fundeweb2.0:faq:datatable.png?500 |DataTable PrimeFaces}} * Paginamos a la siguiente página. {{ :fdw2.0:fundeweb2.0:faq:datatable-pagined.png?500 |DataTable PrimeFaces paginada}} Como resultado obtendremos los datos de la página pero con registros en blanco. **Solución** Para solucionar el problema, solo tenemos que añadir la interface serializable a la clase Java que alimenta el //DataTable//. public class Destinatario implements Serializable { ... } **Referencias** * [[https://forum.primefaces.org/viewtopic.php?t=7931|PrimeFaces Forum - after filtering Empty rows blank rows displayed while paging]] --- //[[juanmiguel.bernal@ticarum.es|JUAN MIGUEL BERNAL GONZALEZ]] 04/03/2020 08:53//