SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
UDA – Utilidades de desarrollo de aplicaciones by EJIE is licensed under a Creative Commons Reconocimiento-
NoComercial-CompartirIgual 3.0 Unported License.
UDA - Utilidades de desarrollo de aplicaciones
Migración v2.0.0
Fecha: 22/06/2012 Referencia:
EJIE S.A.
Mediterráneo, 14
Tel. 945 01 73 00*
Fax. 945 01 73 01
01010 Vitoria-Gasteiz
Posta-kutxatila / Apartado: 809
01080 Vitoria-Gasteiz
www.ejie.es
Migración v2.0.0 ii/25
Control de documentación
Título de documento: Migración v2.0.0
Histórico de versiones
Código: Versión: Fecha: Resumen de cambios:
1.0.0 22/06/2012 Primera versión.
Cambios producidos desde la última versión
Control de difusión
Responsable: Ander Martínez
Aprobado por:
Firma: Fecha:
Distribución:
Referencias de archivo
Autor:
Nombre archivo:
Localización:
Migración v2.0.0 iii/25
Contenido
Capítulo/sección Página
1 Introducción v2.0.0 1
2 Actualización componentes RUP v2.0.0 2
3 Actualización librerías v2.0.0 5
3.1 Dependencias 5
3.2 Ficheros de configuración de Spring 6
4 Configuración idiomática 9
5 Seguridad 13
5.1 Seguridad mediante el uso del Mock 14
5.2 Seguridad mediante el uso de XLNets 17
6 Jackson JSON Processor 18
7 Envío de ficheros desde un mantenimiento 19
8 Validaciones 21
9 Excepciones 22
Migración v2.0.0 1/25
1 Introducción v2.0.0
El objetivo de este documento es describir los cambios necesarios a realizar en aplicaciones que se
encuentren en fase de desarrollo y que consideren necesario actualizar la versión de las utilidades que
proporciona UDA, entendiendo por utilidad los patrones de interacción RUP, la librería de utilidades
x38ShLibClasses, las plantillas de generación de código y el plugin para el Eclipse.
En el caso de nuevos desarrollos con UDA se recomienda descargar la última versión completa y tenerla
como punto de partida.
La actualización a la versión v2.0.0 se puede realizar en función de las necesidades de la aplicación, pero se
dan por sentados los siguientes supuestos:
• La actualización se realiza sobre una aplicación con la versión 1.2.1 de RUP. La actualización directa
desde versiones anteriores no ha sido probada por lo que es posible que pueda darse la necesidad de
realizar modificaciones extras.
• Los ficheros originales de RUP no han sido modificados.
En los capítulos siguientes se describe de forma detallada qué cambios habrá que realizar en cada caso y
además se referencia a diversos anexos de la documentación para profundizar más en cómo se han
implementado y para mostrar ejemplos, además de la propia aplicación x21a que está disponible en el
repositorio de código.
Una guía básica de qué cambios se deben realizar en cada caso en función de las necesidades de la
aplicación sería la siguiente:
Si se quiere modificar únicamente los componentes visuales para resolver posibles problemas
detectados y/o obtener los componentes para los nuevos patrones desarrollados sin tocar el resto
de la aplicación:
o Solo es necesario actualizar los patrones RUP.
o No es necesario actualizar la librería x38. Los componentes son compatibles con la
versión anterior pero no se obtendrá el beneficio de las mejoras practicadas para
validaciones y excepciones.
Si se quiere actualizar la librería de utilidades para beneficiarse de las mejoras en seguridad,
validación, excepciones, gestión idiomática:
o Habrá que actualizar los componentes RUP, la librería x38ShLibClasses y realizar los
cambios requeridos por su uso, a saber: configuración idiomática y configuración de
seguridad.
o No es necesario realizar los cambios de validación y excepciones.
Si se quieren implementar validaciones en servidor y cliente mediante la nueva versión:
o Habrá que actualizar los componentes RUP, la librería x38ShLibClasses, realizar los
cambios de gestión idiomática y seguridad, que son obligatorios, y además los cambios
del sistema de validación y excepción.
Migración v2.0.0 2/25
2 Actualización componentes RUP v2.0.0
Los pasos que se han de realizar para realizar la actualización son los siguientes:
1. Cambiar la carpeta xxxStaticsWebContentrup por la carpeta incluida en el fichero rup-v2.0.0.zip
2. Modificar la inclusión de los ficheros CSS y JS que se detallan a continuación:
<xxxYYY>WarWebContent?WEB-INFlayoutsincludesrup.styles.inc
Modificar las líneas 7-8:
<!-- jQuery UI (custom-theme) -->
<link href="${staticsUrl}/rup/custom-theme/jquery-ui-1.8.20.custom.css" rel="stylesheet" type="text/css" />
Modificar las líneas 10-27:
<!-- Patrones (basic-theme) -->
<link href="${staticsUrl}/rup/basic-theme/theme.rup.base-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.accordion-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.autocomplete-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.breadCrumb-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.combo-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.date-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.feedback-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.grid-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.lang-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.maint-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.menu-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.messages-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.tabs-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.time-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.toolbar-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.tooltip-2.0.0.css" rel="stylesheet" type="text/css" />
Añadir en la línea 28:
<link href="${staticsUrl}/rup/basic-theme/theme.rup.validate-2.0.0.css" rel="stylesheet" type="text/css" />
<link href="${staticsUrl}/rup/basic-theme/theme.rup.wizard-2.0.0.css" rel="stylesheet" type="text/css" />
<xxxYYY>WarWebContent?WEB-INFlayoutsincludesrup.scripts.inc
Modificar las líneas 3-4. Actualización de la versión de jQuery:
<!-- jQuery 1.7.2 -->
<script src="${staticsUrl}/rup/scripts/core/jquery-1.7.2.js" type="text/javascript"></script>
Modificar las líneas 6-8. Modificar las versiones de rup.utils y rup.base:
<!-- RUP-CORE -->
<script src="${staticsUrl}/rup/scripts/rup.utils-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.base-2.0.0.js" type="text/javascript"></script>
Migración v2.0.0 3/25
Añadir en la línea 9:
<script src="${staticsUrl}/rup/scripts/rup.compatibility-2.0.0.js" type="text/javascript"></script>
Actualizar la sección de jQuery UI:
<!-- jQuery UI 1.8.20-->
<script src="${staticsUrl}/rup/scripts/core/ui/jquery-ui-1.8.20.custom.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/ui/jquery-ui.multidatespicker.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/ui/jquery-ui.timepicker.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/ui/jquery.ui.autocomplete.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/ui/jquery.ui.selectmenu.js" type="text/javascript"></script>
Actualizar la sección de jqGrid:
<!-- jqGrid 4.3.2-->
<script src="${staticsUrl}/rup/scripts/core/jqGrid/jqGrid-4.3.2.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/jqGrid/jquery.jqGrid.fluid.js" type="text/javascript"></script>
Actualizar la sección de Utilidades adicionales:
<!—Utilidades adicionales-->
<script src="${staticsUrl}/rup/scripts/core/utils/form2object.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.blockUI.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.fileupload.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.fileupload-ui.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.form.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.iframe-transport.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.json-2.2.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.numeric.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.qtip.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.url.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.validate.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/jquery.xdr-transport.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/utils/xbreadcrumbs.js" type="text/javascript"></script>
Actualizar las versiones de los ficheros de los patrones RUP:
<!-- Patrones RUP -->
<script src="${staticsUrl}/rup/scripts/rup.accordion-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.autocomplete-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.breadCrumb-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.combo-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.date-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.dialog-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.feedback-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.grid-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.lang-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.maint-2.0.0.js" type="text/javascript"></script>
Migración v2.0.0 4/25
<script src="${staticsUrl}/rup/scripts/rup.menu-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.message-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.tabs-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.time-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.toolbar-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.tooltip-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.upload-2.0.0.js" type="text/javascript"></script>
Añadir a continuación las entradas de los nuevos patrones:
<script src="${staticsUrl}/rup/scripts/rup.upload-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.validate-2.0.0.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/rup.wizard-2.0.0.js" type="text/javascript"></script>
Añadir a continuación la siguiente sección nueva:
<!-- Ajustes de compatibilidad de menú-->
<script src="${staticsUrl}/rup/scripts/core/jquery-1.7.2.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.core.menu.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.widget.menu.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.position.menu.js" type="text/javascript"></script>
<script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.menu.js" type="text/javascript"></script>
<script type="text/javascript">widgetMenu = $.noConflict(true);</script>
Migración v2.0.0 5/25
3 Actualización librerías v2.0.0
A continuación se van a exponer las modificaciones que se deben realizar para actualizar las versiones de los
componentes de servidor que se utilizan en la versión v2.0.0.
3.1 Dependencias
La versión v2.0.0 de UDA trae consigo una serie de actualizaciones de las versiones de las librerías que se
utilizan. En concreto, las librerías actualizadas son las siguientes:
Librerías actualizadas
• jackson-core-asl-1.7.2.jar jackson-core-asl-1.9.7.jar
• jackson-mapper-asl-1.7.2.jar jackson-mapper-asl-1.9.7.jar
• logback-classic-0.9.29.jar logback-classic-1.0.6.jar
• logback-core-0.9.29.jar logback-core-1.0.6.jar
• spring-aop-3.0.5.RELEASE.jar spring-aop-3.1.1.RELEASE.jar
• spring-asm-3.0.5.RELEASE.jar spring-asm-3.1.1.RELEASE.jar
• spring-beans-3.0.5.RELEASE.jar spring-beans-3.1.1.RELEASE.jar
• spring-context-3.0.5.RELEASE.jar spring-context-3.1.1.RELEASE.jar
• spring-context-support-3.0.5.RELEASE.jar spring-context-support-3.1.1.RELEASE.jar
• spring-core-3.0.5.RELEASE.jar spring-core-3.1.1.RELEASE.jar
• spring-expression-3.0.5.RELEASE.jar spring-expression-3.1.1.RELEASE.jar
• spring-jdbc-3.0.5.RELEASE.jar spring-jdbc-3.1.1.RELEASE.jar
• spring-orm-3.0.5.RELEASE.jar spring-orm-3.1.1.RELEASE.jar
• spring-security-acl-3.0.5.RELEASE.jar spring-security-acl-3.1.0.RELEASE.jar
• spring-security-config-3.0.5.RELEASE.jar spring-security-config-3.1.0.RELEASE.jar
• spring-security-core-3.0.5.RELEASE.jar spring-security-core-3.1.0.RELEASE.jar
• spring-security-taglibs-3.0.5.RELEASE.jar spring-security-taglibs-3.1.0.RELEASE.jar
• spring-security-web-3.0.5.RELEASE.jar spring-security-web-3.1.0.RELEASE.jar
• spring-tx-3.0.5.RELEASE.jar spring-tx-3.1.1.RELEASE.jar
• spring-web-3.0.5.RELEASE.jar spring-web-3.1.1.RELEASE.jar
• spring-webmvc-3.0.5.RELEASE.jar spring-webmvc-3.1.1.RELEASE.jar
• x38ShLibClasses-1.2.1.jar x38ShLibClasses-2.0.0.jar
Librerías añadidas
• spring-security-crypto-3.1.0.RELEASE.jar
Migración v2.0.0 6/25
Estos son los pasos a seguir para realizar la actualización de las librerías:
1. Actualizar el repositorio de dependencias Maven con la nueva versión 2.0.0, que contiene las nuevas
versiones de las librerías [Opcional]. En caso de no realizarlo, el Eclipse se conectará al repositorio de
Internet para descargarse las librerías con lo que el proceso será más lento.
2. Actualizar el fichero "pom.xml" del proyecto xxxEAR para dejar acorde las dependencias de las
librerías:
...
<properties>
<org.springframework.version>3.1.1.RELEASE</org.springframework.version>
<org.springframework.security.version>3.1.0.RELEASE</org.springframework.security.version>
<org.logback.version>1.0.6</org.logback.version>
...
<com.ejie.x38.version>2.0.0</com.ejie.x38.version>
</properties>
...
...
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.7</version>
</dependency>
...
...
3. Cerrar el Eclipse y borrar las librerías del proyecto EAR alojadas en xxxEARAPP_INFlib.
4. Abrir el "build.xml" del proyecto xxxEAR con el editor Ant (botón derecho sobre el fichero, Open
With>Ant Editor)
5. Ejecuta la tarea "mavenRunDependencies" (botón derecho sobre la tarea, Run As>Ant Build)
actualizando las nuevas librerías xxxEARAPP_INFlib
6. Sobre el proyecto xxxEAR pulsar F5 (Refresh)
3.2 Ficheros de configuración de Spring
La actualización de la versión de Spring implica la modificación de los esquemas de los ficheros de
configuración.
Las modificaciones se deben de llevar a cabo en los siguientes ficheros:
• <xxxYYY>EARClasses/src
o beanRefContext.xml
• <xxxYYY>EARClasses/src/spring
o dao-config.xml
o log-config.xml
o security-config.xml
Migración v2.0.0 7/25
o service-config.xml
o tx-config.xml
• <xxxYYY>War/WebContent/WEB-INF/spring
o app-config.xml
o log-config.xml
o mvc-config.xml
o security-config.xml
o security-core-config.xml
o validation-config.xml
En cada uno de estos ficheros se ha de modificar la versión de los esquemas de configuración. La versión
debe de modificarse de la 3.0 existente a la 3.1. Como ejemplo mostramos la modificación realizada en el
fichero app-config.xml.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd">
<import resource="mvc-config.xml" />
<import resource="log-config.xml"/>
<import resource="validation-config.xml"/>
<import resource="security-core-config.xml"/>
<import resource="security-config.xml"/>
</beans>
En concreto hay que modificar las líneas
Migración v2.0.0 8/25
...
...
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
...
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
...
http://www.springframework.org/schema/context/spring-context-3.0.xsd
...
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
...
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
...
http://www.springframework.org/schema/task/spring-task-3.0.xsd"
...
...
Por las siguientes:
...
...
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
...
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
...
http://www.springframework.org/schema/context/spring-context-3.1.xsd
...
http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
...
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
...
http://www.springframework.org/schema/task/spring-task-3.1.xsd"
...
...
Migración v2.0.0 9/25
4 Configuración idiomática
El capítulo que nos ocupa pretende recopilar los cambios a realizar en una aplicación para utilizar la nueva
gestión de idioma implementada en esta versión. Se puede ver más en detalle como se ha implementado esta
gestión en el anexo Gestión idiomática.
A continuación se detalla proyecto a proyecto los cambios necesarios (en el siguiente capítulo se detallará las
mejoras aportadas con dichos cambios):
<xxxConfig>
o xxx.properties: Contiene variables para la gestión del idioma y del layout que ya no se
utilizan ya que se declaran a nivel de War en su mvc-config.xml, por lo que podrían eliminarse.
x21aPilotoPatronesWar.default.language=es
x21aPilotoPatronesWar.default.layout=horizontal
<xxxEAR>
o Sustituir la librería de x38 por la nueva versión x38ShLibClasses-2.0.0.jar
<xxxEARClasses>
o Modificar el fichero service-config.xml el bean appMessageSource añadiendo las líneas
destacadas.
<bean id="appMessageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="x21a.i18n" />
<property name="defaultEncoding" value="UTF-8" />
<<<<propertypropertypropertyproperty namenamenamename===="useCodeAsD"useCodeAsD"useCodeAsD"useCodeAsDefaultMessage"efaultMessage"efaultMessage"efaultMessage" valuevaluevaluevalue===="true""true""true""true" />/>/>/>
<<<<propertypropertypropertyproperty namenamenamename===="fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale" valuevaluevaluevalue===="false""false""false""false" />/>/>/>
</bean>
<xxxNombreWAR>
o Modificar el fichero mvc-config.xml el bean messageSource añadiendo las líneas
destacadas.
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="parentMessageSource" ref="appMessageSource" />
<property name="basename" value="/WEB-INF/resources/x21aMantenimientos.i18n" />
<property name="defaultEncoding" value="UTF-8" />
<<<<propertypropertypropertyproperty namenamenamename===="useCodeAsDefaultMessage""useCodeAsDefaultMessage""useCodeAsDefaultMessage""useCodeAsDefaultMessage" valuevaluevaluevalue===="true""true""true""true" />/>/>/>
<<<<propertypropertypropertyproperty namenamenamename===="fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale" valuevaluevaluevalue===="false""false""false""false" />/>/>/>
</bean>
Migración v2.0.0 10/25
o Modificar el fichero mvc-config.xml para sustituir el antiguo interceptor por el nuevo.
Teniendo en cuenta que ahora las propiedades del fichero xxx.properties para la gestión de
idioma por defecto y layout se configuran mediante propiedades del interceptor.
[Viejo]
<!-- Configures Handler Interceptors -->
<mvc:interceptors>
<!-- Changes the locale when a 'locale' request parameter is sent;e.g./?locale=en -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
<!-- Saves a locale change using a cookie -->
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName">
<value>language</value>
</property>
</bean>
[Nuevo]
<mvc:interceptors>
<ref bean="mvcInterceptor"/>
</mvc:interceptors>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="language" />
</bean>
<bean id="mvcInterceptor" class="com.ejie.x38.control.MvcInterceptor">
<property name="defaultLanguage" value="es" />
<property name="defaultLayout" value="horizontal" />
<property name="availableLangs" value="es,eu,en,fr" />
</bean>
o Modificar el fichero mvc-config.xml para añadir las nuevas clases de resolución de vista
incluídas en x38.
[Viejo]
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.tiles2.TilesView" />
</bean>
Migración v2.0.0 11/25
[Nuevo]
<bean id="viewResolver"
class="com.ejie.x38.control.view.UdaViewResolver">
<property name="viewClass" value="com.ejie.x38.control.view.UdaTilesView"/>
<property name="exposedContextBeanNames" >
<list>
<value>localeResolver</value>
<value>mvcInterceptor</value>
</list>
</property>
</bean>
o Modificar el fichero base-includes.jsp para cambiar las variables utilizadas en la
configuración del idioma para RUP:
[Viejo]
<script type="text/javascript">
APP_RESOURCES = 'x21a',
CTX_PATH = '<%= request.getContextPath()%>/',
RUP = '${staticsUrl}/rup',
STATICS = '${staticsUrl}',
DEFAULT_LANGUAGE =DEFAULT_LANGUAGE =DEFAULT_LANGUAGE =DEFAULT_LANGUAGE = "${defaultLanguage}""${defaultLanguage}""${defaultLanguage}""${defaultLanguage}",,,,
LAYOUT = "${defaultLayout}",
WAR_NAME = "x21aPilotoPatrones",
AVAILABLE_LANGS =AVAILABLE_LANGS =AVAILABLE_LANGS =AVAILABLE_LANGS = "es, eu, en, fr""es, eu, en, fr""es, eu, en, fr""es, eu, en, fr";;;;
</script>
[Nuevo]
<script type="text/javascript">
APP_RESOURCES = 'x21a',
CTX_PATH = '<%= request.getContextPath()%>/',
STATICS = '${staticsUrl}',
RUP = '${staticsUrl}/rup',
WAR_NAME = "x21aPilotoPatrones",
//model//model//model//model
LAYOUT = "${defaultLayout}",
//mvc//mvc//mvc//mvc----config.xmlconfig.xmlconfig.xmlconfig.xml
AVAILABLE_LANGS = "$AVAILABLE_LANGS = "$AVAILABLE_LANGS = "$AVAILABLE_LANGS = "${mvcInterceptor.availableLangs}",{mvcInterceptor.availableLangs}",{mvcInterceptor.availableLangs}",{mvcInterceptor.availableLangs}",
LOCALE_COOKIE_NAME =LOCALE_COOKIE_NAME =LOCALE_COOKIE_NAME =LOCALE_COOKIE_NAME = "${locale_cookieName}""${locale_cookieName}""${locale_cookieName}""${locale_cookieName}";;;;
LOCALE_PARAM_NAME =LOCALE_PARAM_NAME =LOCALE_PARAM_NAME =LOCALE_PARAM_NAME = "${locale_paramName}""${locale_paramName}""${locale_paramName}""${locale_paramName}";;;;
</script>
DEFAULT_LANGUAGE (deprecated): Ahora se carga desde el mvc-config.xml
LOCALE_COOKIE_NAME: Nombre de la cookie (definida en mvc-config.xml)
LOCALE_PARAM_NAME: Nombre del parámetro de cambio de idioma (definida en
mvc-config.xml)
Migración v2.0.0 12/25
AVAILABLE_LANGS: Posibles lenguajes de la aplicación (definidos en mvc-
config.xml)
<xxxStatics>
o Modificar en el fichero _layoutLoader.js (existe uno por cada War) para cambiar la invocación
del componente rup.language [en caso de que se utilice] utilizando la variable definida.
[Viejo]
$("#x21aPilotoPatronesWar_language").rup_language({languages:
["es", "eu", "en", "fr"]});
[Nuevo]
$("#x21aMantenimientosWar_language").rup_language({languages:
$.rup.AVAILABLE_LANGS_ARRAY$.rup.AVAILABLE_LANGS_ARRAY$.rup.AVAILABLE_LANGS_ARRAY$.rup.AVAILABLE_LANGS_ARRAY});
Migración v2.0.0 13/25
5 Seguridad
La actualización a la versión v2.0.0 de UDA requiere de una serie de ajustes en el componente de seguridad.
Las modificaciones son diferentes dependiendo si se está utilizando el Mock de seguridad o el provider de
XLNets.
En cualquiera de los dos casos es necesario realizar una serie de ajustes en el fichero de configuración
común security-core-config.xml. Este fichero se define a nivel de War por lo que estas modificaciones
deberán realizarse tantas veces como módulos web disponga la aplicación.
Así pues, se deberá sustituir la definición del bean springSecurityFilterChain existente:
<bean id="springSecurityFilterChain"
class="org.springframework.security.web.FilterChainProxy">
<security:filter-chain-map path-type="ant">
<security:filter-chain pattern="/error" filters="none"/>
<security:filter-chain pattern="/accesRefused" filters="none"/>
<security:filter-chain pattern="**" filters="
exceptionTranslationFilter,
securityContextPersistenceFilter,
logoutFilter,
preAuthenticateProcessingFilter,
filterSecurityInterceptor" />
<security:filter-chain pattern="/**" filters="
exceptionTranslationFilter,
securityContextPersistenceFilter,
logoutFilter,
preAuthenticateProcessingFilter,
filterSecurityInterceptor" />
</security:filter-chain-map>
</bean>
La nueva configuración será la siguiente:
<bean id="springSecurityFilterChain"
class="org.springframework.security.web.FilterChainProxy">
<security:filter-chain-map request-matcher="regex">
<security:filter-chain pattern="/mockLoginPage.*" filters="none"/>
<security:filter-chain pattern="/mockLoginAjaxPage.*" filters="none"/>
<security:filter-chain pattern="/error.*" filters="none"/>
<security:filter-chain pattern="/accessDenied.*" filters="none"/>
<security:filter-chain pattern="**" filters="
exceptionTranslationFilter,
securityContextPersistenceFilter,
logoutFilter,
preAuthenticateProcessingFilter,
filterSecurityInterceptor" />
</security:filter-chain-map>
</bean>
Migración v2.0.0 14/25
Del mismo modo, se deberá modificar la inicialización del bean myLogoutHandler eliminando la inicialización
de la propiedad invalidateXlnetSession:
<property name="invalidateXlnetSession" value="false" />
Y añadiendo la nueva para la propiedad invalidateUserSession. La declaración final sería la siguiente:
<bean id="myLogoutHandler" class="com.ejie.x38.security.MyLogoutHandler">
<property name="perimetralSecurityWrapper" ref="perimetralSecurityWrapper" />
<property name="invalidateHttpSession" value="true" />
<property name="invalidateUserSession" value="true" />
</bean>
5.1 Seguridad mediante el uso del Mock
En aquellos desarrollos en los que se esté haciendo uso del mock para simular XLNets cuando la aplicación
no está desplegada en Ejie, habrá que realizar las siguientes modificaciones en el fichero security-config.xml
del War:
Se deberá modificar la configuración del perimetralSecurityWrapper.
[Configuración anterior]
<bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperMockImpl">
<property name="principal" value="USER_UDA" />
<property name="roles">
<list>
<value>UDA</value>
</list>
</property>
<property name="uidSession" value="1290789636844" />
</bean>
[Configuración nueva]
<bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperMockImpl">
<property name="principal">
<list>
<map>
<entry key="userName" value="USER_UDA"/>
<entry key="nif" value="12121212j"/>
<entry key="policy" value="1"/>
<entry key="position" value="01"/>
<entry key="isCertificate" value="no"/>
<entry key="roles">
<list>
Migración v2.0.0 15/25
<value>UDA</value>
</list>
</entry>
</map>
</list>
</property>
<property name="userChangeUrl"
value="http://desarrollo.jakina.ejiedes.net:7001/x21aMantenimientosWar/"/>
</bean>
La nueva implementación permite especificar diferentes usuarios indicando para cada uno de ellos una
configuración de seguridad diferente. Estos usuarios son definidos mediante una lista con la que realizará la
inicialización de la propiedad principal. De este modo es posible disponer de una serie de usuarios entre los
cuales se podrá seleccionar uno de ellos para hacer login al acceder a la aplicación.
De este modo para realizar la migración de la configuración de usuarios existente, se deberá de crear por
cada usuario una entrada en la lista con la que se inicializa la propiedad principal.
<property name="principal">
<list>
<!-- Usuario 1 -->
<map>
<entry key="userName" value="USER_1"/>
...
<entry key="roles">
<list>
<value>ROLE_1</value>
<value>XXX-IN-0001</value>
...
</list>
</entry>
</map>
<!-- Usuario 2 -->
<map>
<entry key="userName" value="USER_2"/>
...
<entry key="roles">
<list>
<value>ROLE_1</value>
<value>XXX-IN-0002</value>
<value>XXX-IN-0003</value>
...
</list>
</entry>
</map>
</list>
</property>
Además de la incorporación de múltiples usuarios, el Mock ofrece la posibilidad de definir una url, la propiedad
userChangeLog, que determina la URL a la que debe ir la aplicación si el usuario logado cambia sin previo
Migración v2.0.0 16/25
aviso. Esta nueva propiedad, simula el comportamiento que también tiene XLNets para evitar cambios de
usuarios en mitad de una ejecución y evitar posibles inconsistencias de identidad (accesos anómalos).
Las siguientes modificaciones que se han de realizar son para incluir una página de login simulará el registro
de usuarios en la aplicación.
Proyecto WEB:
• xxxYYYWar/WebContent/WEB-INF/layouts/templateLogin.jsp
• xxxYYYWar/WebContent/WEB-INF/layouts/includes/mockLoginPage.styles.inc
• xxxYYYWar/WebContent/WEB-INF/views/mockLogin/mockLoginAjaxPage.jsp
• xxxYYYWar/WebContent/WEB-INF/views/mockLogin/mockLoginPage.jsp
• xxxYYYWar/WebContent/WEB-INF/views/mockLogin/mockLoginPage-includes.jsp
Proyecto de estáticos:
• xxxYYYStatics/WebContent/<xxx>/scripts/<xxxYYY>/mockLoginPage.js
• xxxYYYStatics/WebContent/<xxx>/styles/mockLoginPage.css
Estos ficheros se pueden encontrar tanto en la aplicación de ejemplo como en el fichero adjunto disponibles
en la web de UDA.
Una vez incorporados los nuevos ficheros a la aplicación, es necesario realizar las siguientes modificaciones.
En el fichero tiles.xml se deben añadir las entradas correspondientes a la template del mock y a la propia
entrada de la página de login.
<definition name="templateLogintemplateLogintemplateLogintemplateLogin" template="/WEB-INF/layouts/templateLogin.jsp">
<put-attribute name="header" value="/WEB-INF/layouts/header.jsp"/>
<put-attribute name="language" value="/WEB-INF/layouts/language.jsp"/>
<put-attribute name="breadCrumb" value="/WEB-INF/layouts/breadCrumb.jsp" />
<put-attribute name="footer" value="/WEB-INF/layouts/footer.jsp"/>
<put-attribute name="base-includes" value="/WEB-INF/layouts/base-includes.jsp"/>
<put-attribute name="includes" value=""/>
</definition>
<definition name="mockLoginPagemockLoginPagemockLoginPagemockLoginPage" extends="templateLogin">
<put-attribute name="content" value="/WEB-INF/views/mockLogin/mockLoginPage.jsp"/>
<put-attribute name="includes" value="/WEB-INF/views/mockLogin/mockLoginPage-includes.jsp"/>
</definition>
<definition name="mockLoginAjaxPagemockLoginAjaxPagemockLoginAjaxPagemockLoginAjaxPage" template="/WEB-INF/views/mockLogin/mockLoginAjaxPage.jsp"/>
En el fichero mvc-config.xml se deben añadir los mapeos correspondientes para el login:
<mvc:view-controller path="/mockLoginPage" view-name="mockLoginAjaxPage" />
<mvc:view-controller path="/mockLoginAjaxPage" view-name="mockLoginAjaxPage" />
Migración v2.0.0 17/25
La página de login del mock hace uso de una serie de literales internacionalizados que se deben añadir en los
ficheros de i18n de la aplicación. La lista de literales de los que hace uso es la siguiente:
...
app.title=Uda
mockLogin.selectUser=Elija un Usuario
mockLogin.selectedUser=Usuario seleccionado:
mockLogin.login_button=Iniciar Sesión
logOut.disconnect=Desconectar
...
5.2 Seguridad mediante el uso de XLNets
Para usar Xlnets como sistema de seguridad a partir de la versión v.2.0.0, hay que modificar la declaración del
bean perimetralSecurityWrapper en el fichero de configuración de Spring security-config.xml.
[Viejo]
<bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperN38Impl">
<property name="xlnetCachingPeriod" value="120" />
</bean>
[Nuevo]
<bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperN38Impl">
<property name="xlnetCachingPeriod" value="120" />
<property name="userChangeUrl" value="/x21aPilotoPatronesWar/" />
<property name="anonymousCredentials">
<map>
<entry key="userProfiles" value="UDA" />
<!-- entry key="userProfiles" value="udaAnonymousProfile" /-->
<entry key="position" value="udaAnonymousPosition" />
</map>
</property>
</bean>
Migración v2.0.0 18/25
6 Jackson JSON Processor
Al desarrollar la versión v2.0.0 se ha tratado de mantener el mayor grado de retrocompatibilidad con las
implementaciones existentes en las aplicaciones que hacen uso del componente de Jackson. Los desarrollos
que hacen uso de las funcionalidades del componente Jackson incluido en las versiones anteriores a la v2.0.0
de UDA son compatibles siempre y cuando no se hayan utilizado funcionalidades deprecadas en la nueva
versión de Jackson.
Sin embargo en la nueva versión de Jackson se han implementado una serie de nuevas funcionalidades que
mejoran y potencian los procesos de serialización y deserialización. Del mismo modo, se facilita la
configuración de ambos procesos permitiendo una mayor flexibilidad en su uso.
Para que las aplicaciones puedan beneficiarse de estas mejoras es necesario realizar una serie de ajustes en
la configuración de Jackson. Así pues, a pesar de que no es estrictamente necesaria la actualización para que
la aplicación siga funcionando de manera correcta, si se recomienda llevarla a cabo para mejorar el proceso
de desarrollo. Por supuesto esta decisión se deberá tomar de acuerdo a las necesidades puntuales y el grado
de desarrollo de las aplicaciones.
El proceso de actualización completo se puede encontrar en el anexo Configuración y uso de Jackson. De
todos modos es necesario indicar que existe una característica de Jackson que ha variado su funcionamiento
y que requiere de un ajuste en la implementación existente.
En versiones posteriores a Jackson 1.9, la anotación @JsonIgnore podía ser utilizada a nivel de método (ej.
un método getter de una propiedad). A partir de la versión 1.9 es posible anotar un método pero se toma
como una anotación de propiedad. Es decir si estamos anotando el método getter mediante @JsonIgnore,
esta propiedad no solo se ignorará en el proceso de serialización sino que también será obviada al realizar la
deserialización. Debido a esto es necesario modificar el código existente para utilizar la anotación
@JsonProperty(“propiedad”) en el método que queremos que conserve su funcionalidad.
Como ejemplo, en el siguiente código realizaremos las anotaciones correspondientes para que la clave de
acceso de un alumno no sea procesada durante la serialización pero si en la deserialización. En el código
existente solo existiría la anotación @JsonIgnore para evitar la serialización de la propiedad. Con la
actualización a la nueva versión de Jackson, se deberá de añadir la anotación resaltada en el setter,
@JsonProperty(“password”), para que se continúe realizando la deserialización.
publicpublicpublicpublic classclassclassclass Alumno implementsimplementsimplementsimplements java.io.Serializable {
privateprivateprivateprivate BigDecimal id;
privateprivateprivateprivate String nombre;
privateprivateprivateprivate String apellido1;
privateprivateprivateprivate String apellido2;
privateprivateprivateprivate String password;
// Getters y setters de las propiedades
@JsonIgnore
publicpublicpublicpublic String getPassword() {
returnreturnreturnreturn thisthisthisthis.password;
}
@JsonProperty@JsonProperty@JsonProperty@JsonProperty(((("password""password""password""password"))))
publicpublicpublicpublic voidvoidvoidvoid setPassword(String password) {
thisthisthisthis.password = password;
}
}
Migración v2.0.0 19/25
7 Envío de ficheros desde un mantenimiento
En actualización de las versiones de Spring y de las librerías jQuery se han introducido una serie de mejoras y
modificaciones en sus funcionalidades. Estos cambios implican realizar una serie de ajustes en el proceso de
subida de archivos pero conllevan una simplificación y optimización del mismo.
Las mejoras logradas en el proceso son las siguientes:
• Se posibilita el envío de ficheros mediante peticiones PUT y POST, dependiendo del tipo de operación
que sea (edición o inserción). En la anterior versión de Spring no se permitía el envío de ficheros
mediante una petición de tipo multipart/form-data utilizando un método HTTP PUT.
• Se elimina la necesidad de utilizar las cabeceras que indican el tipo de operación que se está
realizando en las peticiones del mantenimiento.
• Las peticiones en las que esté involucrado un campo file se realizan siempre del mismo modo,
independientemente de si se haya seleccionado un fichero o no. Esto simplifica la gestión de
peticiones en los controllers.
La característica principal que permite esta serie de mejoras es la posibilidad de realizar un envío de ficheros
mediante PUT. Esto es debido a que en la versión 3.1.1 de Spring se han realizado modificaciones en la clase
RequestParamMethodArgumentResolver que permiten que las peticiones multipart/form-data puedan ser
realizadas mediante una petición PUT.
Aun así, la clase CommonsMultipartResolver encargada de gestionar las peticiones multipart/form-data sigue
limitando que estas peticiones deban ser realizadas mediante peticiones POST. Para evitar esto se ha creado
una clase UdaMultipartResolver que extiende de la anterior sobrescribiendo el método de comprobación de
una petición multipart válida.
La modificación en la configuración de Spring se deberá realizar en el fichero mvc-config.xml definido a nivel
de War, por lo que se deberá realizar esta modificación tantas veces como módulos web, en los que se realice
subida de ficheros, disponga la aplicación.
El cambio supone sustituir el uso del CommonsMultipartResolver por el nuevo UdaMultipartResolver:
[Viejo]
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
[Nuevo]
<bean id="multipartResolver" class="com.ejie.x38.util.UdaMultipartResolver"/>
El siguiente paso será modificar en los controllers los métodos encargados de procesar las peticiones de
envío de ficheros.
NOTA: Solamente deberán modificarse los métodos involucrados en el proceso del envío de ficheros.
En el envío de ficheros desde un formulario de detalle de un mantenimiento se deberán modificar los
métodos que procesan la inserción y modificación de un elemento.
En el siguiente código se muestran resaltadas las modificaciones a realizar en las anotaciones de mapeo de
peticiones de los métodos de los controllers. Con la nueva versión el método de edición de un elemento se
Migración v2.0.0 20/25
mapeará con peticiones que utilicen el método HTTP PUT. En ambos métodos se elimina el uso de la
cabecera rup_maint_mode en la petición.
[Viejo]
@RequestMapping@RequestMapping@RequestMapping@RequestMapping((((method = RequestMethod.method = RequestMethod.method = RequestMethod.method = RequestMethod.POSTPOSTPOSTPOST, headers=, headers=, headers=, headers="rup_maint_mode=add""rup_maint_mode=add""rup_maint_mode=add""rup_maint_mode=add"))))
publicpublicpublicpublic @ResponseBody PerfilUsuario add(
@ModelAttribute PerfilUsuario perfilUsuario,
@RequestParam(value="imagen", required=false)MultipartFile imagen,
HttpServletResponse response) {
// Implementación de la funcionalidad del método
}
@RequestMapping@RequestMapping@RequestMapping@RequestMapping(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.POSTPOSTPOSTPOST, headers=, headers=, headers=, headers="rup_maint_mode=edit""rup_maint_mode=edit""rup_maint_mode=edit""rup_maint_mode=edit"))))
publicpublicpublicpublic @ResponseBody PerfilUsuario edit(
@ModelAttribute PerfilUsuario perfilUsuario,
@RequestParam(value="imagen", required=false)MultipartFile imagen,
HttpServletResponse response) {
// Implementación de la funcionalidad del método
}
[Nuevo]
@RequestMapping@RequestMapping@RequestMapping@RequestMapping(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.POSTPOSTPOSTPOST))))
publicpublicpublicpublic @ResponseBody PerfilUsuario add(
@ModelAttribute PerfilUsuario perfilUsuario,
@RequestParam(value="imagen", required=false)MultipartFile imagen,
HttpServletResponse response) {
// Implementación de la funcionalidad del método
}
@RequestMapping@RequestMapping@RequestMapping@RequestMapping(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.PPPPUTUTUTUT))))
publicpublicpublicpublic @ResponseBody PerfilUsuario edit(
@ModelAttribute PerfilUsuario perfilUsuario,
@RequestParam(value="imagen", required=false)MultipartFile imagen,
HttpServletResponse response) {
// Implementación de la funcionalidad del método
}
Migración v2.0.0 21/25
8 Validaciones
La nueva versión v2.0.0 de UDA conlleva una profunda remodelación en el sistema de validaciones. Mediante
el nuevo sistema se ha buscado reducir el impacto de implementaciones propias en la gestión de validaciones
y tratar de dar una solución basada en la especificación JSR-303 para validaciones de beans.
Se ha desarrollado también un sistema de validaciones en cliente para tratar de maximizar el rendimiento de
las aplicaciones en este aspecto. Para ello se ha tratado de simplificar y optimizar la comunicación del
resultado de los procesos de validación entre las partes servidor y cliente.
Debido a estos cambios se deben realizar una serie de ajustes para poder beneficiarse de las funcionalidades
y mejoras del nuevo sistema de validaciones. Estas modificaciones se detallan en el anexo Gestión de
validaciones.
De todos modos y buscando no perjudicar a las implementaciones existentes, se ha mantenido una
retrocompatibilidad completa con el sistema de validaciones existente, por lo que en caso de no ser necesario
el uso de las nuevas funcionalidades no es obligatorio acometer las actualización a la nueva versión.
Migración v2.0.0 22/25
9 Excepciones
La nueva versión v2.0.0 de UDA presenta una nueva gestión de excepciones.
Las aplicaciones desarrolladas con versiones anteriores UDA contaban con una serie de excepciones por
defecto dentro de la librería x38. Mediante el uso de estas clases se conseguía una gestión homogénea en
todas las aplicaciones, pero era labor del desarrollador la gestión de cada excepción de la aplicación.
A partir de la versión v.2.0.0 la gestión independiza el código de las clases (ya sean controllers, services o
daos) de las excepciones ya que éstas se gestionan a través de una clase externa denominada handler (en
caso de necesidad también se podría realizar la gestión en el propio controller). La generación de código
mediante el plugin UDA aporta un handler genérico que realiza la gestión por defecto de las excepciones pero
será labor del desarrollador decidir si quiere realizar una gestión particular de cierto tipo de excepciones.
El uso de este nuevo sistema de excepciones necesita de una serie de modificaciones para migrar a la nueva
gestión. El proceso de migración se detalla en el anexo Gestión de excepciones.
De todos modos y buscando no perjudicar a las implementaciones existentes, se ha mantenido una
retrocompatibilidad completa con el sistema de excepciones existente, por lo que en caso de no ser necesario
el uso de las nuevas funcionalidades no es obligatorio acometer las actualización a la nueva versión.

Contenu connexe

Tendances (16)

Diapositivas Web Util
Diapositivas Web UtilDiapositivas Web Util
Diapositivas Web Util
 
webutil oracle forms
webutil oracle formswebutil oracle forms
webutil oracle forms
 
mysql y visual c++.pdf
mysql y visual c++.pdfmysql y visual c++.pdf
mysql y visual c++.pdf
 
Webutil
WebutilWebutil
Webutil
 
Webutil
WebutilWebutil
Webutil
 
Deploy
DeployDeploy
Deploy
 
Oracle Forms
Oracle FormsOracle Forms
Oracle Forms
 
Proyectos JAVA con maven
Proyectos JAVA con mavenProyectos JAVA con maven
Proyectos JAVA con maven
 
UDA-Componentes RUP. Upload
UDA-Componentes RUP. UploadUDA-Componentes RUP. Upload
UDA-Componentes RUP. Upload
 
Tutorial eclipse
Tutorial eclipseTutorial eclipse
Tutorial eclipse
 
Creación de extensiones nativas
Creación de extensiones nativasCreación de extensiones nativas
Creación de extensiones nativas
 
Eclipse para novatos java
Eclipse para novatos javaEclipse para novatos java
Eclipse para novatos java
 
TUTORIAL
TUTORIALTUTORIAL
TUTORIAL
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
File
FileFile
File
 
Mi primera-hora-con-eclipse
Mi primera-hora-con-eclipseMi primera-hora-con-eclipse
Mi primera-hora-con-eclipse
 

Similaire à UDA-Migracion a v2

UDA-Componentes RUP. Tabla.v2.4.6
UDA-Componentes RUP. Tabla.v2.4.6UDA-Componentes RUP. Tabla.v2.4.6
UDA-Componentes RUP. Tabla.v2.4.6Ander Martinez
 
UDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla AvanzadaUDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla AvanzadaAnder Martinez
 
UDA-Componentes RUP. Tabla 2.4.1 (deprecado)
UDA-Componentes RUP. Tabla 2.4.1 (deprecado)UDA-Componentes RUP. Tabla 2.4.1 (deprecado)
UDA-Componentes RUP. Tabla 2.4.1 (deprecado)Ander Martinez
 
UDA-Componentes RUP. Migas
UDA-Componentes RUP. MigasUDA-Componentes RUP. Migas
UDA-Componentes RUP. MigasAnder Martinez
 
UDA-Componentes RUP. Mantenimiento (v2.1.1 deprecado)
UDA-Componentes RUP. Mantenimiento  (v2.1.1 deprecado)UDA-Componentes RUP. Mantenimiento  (v2.1.1 deprecado)
UDA-Componentes RUP. Mantenimiento (v2.1.1 deprecado)Ander Martinez
 
UDA-Componentes RUP. Menú
UDA-Componentes RUP. MenúUDA-Componentes RUP. Menú
UDA-Componentes RUP. MenúAnder Martinez
 
UDA-Componentes RUP. Pestañas
UDA-Componentes RUP. PestañasUDA-Componentes RUP. Pestañas
UDA-Componentes RUP. PestañasAnder Martinez
 
UDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingUDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingAnder Martinez
 
UDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingUDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingAnder Martinez
 
Plan de Desarrollo de Software - Sistema Gestor de Oferta y Adjudicación de P...
Plan de Desarrollo de Software - Sistema Gestor de Oferta y Adjudicación de P...Plan de Desarrollo de Software - Sistema Gestor de Oferta y Adjudicación de P...
Plan de Desarrollo de Software - Sistema Gestor de Oferta y Adjudicación de P...Yessenia I. Martínez M.
 
UDA-Componentes RUP. Accordion
UDA-Componentes RUP. AccordionUDA-Componentes RUP. Accordion
UDA-Componentes RUP. AccordionAnder Martinez
 
Manual de instalacion y tecnico JOOMLA
Manual de instalacion y tecnico JOOMLAManual de instalacion y tecnico JOOMLA
Manual de instalacion y tecnico JOOMLAEdgar Sandoval
 
UDA-Componentes RUP. Botonera
UDA-Componentes RUP. BotoneraUDA-Componentes RUP. Botonera
UDA-Componentes RUP. BotoneraAnder Martinez
 
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)Ander Martinez
 
UDA-Componentes RUP dialogo.v2.4.0
UDA-Componentes RUP dialogo.v2.4.0UDA-Componentes RUP dialogo.v2.4.0
UDA-Componentes RUP dialogo.v2.4.0Ander Martinez
 

Similaire à UDA-Migracion a v2 (20)

UDA-Componentes RUP. Tabla.v2.4.6
UDA-Componentes RUP. Tabla.v2.4.6UDA-Componentes RUP. Tabla.v2.4.6
UDA-Componentes RUP. Tabla.v2.4.6
 
UDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla AvanzadaUDA-Componentes RUP. Tabla Avanzada
UDA-Componentes RUP. Tabla Avanzada
 
UDA-Componentes RUP. Tabla 2.4.1 (deprecado)
UDA-Componentes RUP. Tabla 2.4.1 (deprecado)UDA-Componentes RUP. Tabla 2.4.1 (deprecado)
UDA-Componentes RUP. Tabla 2.4.1 (deprecado)
 
UDA-Componentes RUP. Migas
UDA-Componentes RUP. MigasUDA-Componentes RUP. Migas
UDA-Componentes RUP. Migas
 
UDA-Componentes RUP. Mantenimiento (v2.1.1 deprecado)
UDA-Componentes RUP. Mantenimiento  (v2.1.1 deprecado)UDA-Componentes RUP. Mantenimiento  (v2.1.1 deprecado)
UDA-Componentes RUP. Mantenimiento (v2.1.1 deprecado)
 
UDA-Componentes RUP. Menú
UDA-Componentes RUP. MenúUDA-Componentes RUP. Menú
UDA-Componentes RUP. Menú
 
Examen intermedio ad
Examen intermedio adExamen intermedio ad
Examen intermedio ad
 
UDA-Componentes RUP. Pestañas
UDA-Componentes RUP. PestañasUDA-Componentes RUP. Pestañas
UDA-Componentes RUP. Pestañas
 
Tema 3
Tema 3Tema 3
Tema 3
 
UDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingUDA-Componentes RUP. Reporting
UDA-Componentes RUP. Reporting
 
UDA-Componentes RUP. Reporting
UDA-Componentes RUP. ReportingUDA-Componentes RUP. Reporting
UDA-Componentes RUP. Reporting
 
Diapositiva Web 2.0
Diapositiva Web 2.0Diapositiva Web 2.0
Diapositiva Web 2.0
 
Web 2.0
Web 2.0Web 2.0
Web 2.0
 
Plan de Desarrollo de Software - Sistema Gestor de Oferta y Adjudicación de P...
Plan de Desarrollo de Software - Sistema Gestor de Oferta y Adjudicación de P...Plan de Desarrollo de Software - Sistema Gestor de Oferta y Adjudicación de P...
Plan de Desarrollo de Software - Sistema Gestor de Oferta y Adjudicación de P...
 
UDA-Componentes RUP. Accordion
UDA-Componentes RUP. AccordionUDA-Componentes RUP. Accordion
UDA-Componentes RUP. Accordion
 
Manual de instalacion y tecnico JOOMLA
Manual de instalacion y tecnico JOOMLAManual de instalacion y tecnico JOOMLA
Manual de instalacion y tecnico JOOMLA
 
UDA-Componentes RUP. Botonera
UDA-Componentes RUP. BotoneraUDA-Componentes RUP. Botonera
UDA-Componentes RUP. Botonera
 
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)UDA-Componentes RUP. Diálogo  (v2.1.0 deprecado)
UDA-Componentes RUP. Diálogo (v2.1.0 deprecado)
 
UDA-Componentes RUP dialogo.v2.4.0
UDA-Componentes RUP dialogo.v2.4.0UDA-Componentes RUP dialogo.v2.4.0
UDA-Componentes RUP dialogo.v2.4.0
 
Web 2.0
Web 2.0Web 2.0
Web 2.0
 

Plus de Ander Martinez

Arinbide Adaptativo. Visión del producto.v1.0
Arinbide Adaptativo. Visión del producto.v1.0Arinbide Adaptativo. Visión del producto.v1.0
Arinbide Adaptativo. Visión del producto.v1.0Ander Martinez
 
Arinbide Adaptativo. Retrospectiva.v1.0
Arinbide Adaptativo. Retrospectiva.v1.0Arinbide Adaptativo. Retrospectiva.v1.0
Arinbide Adaptativo. Retrospectiva.v1.0Ander Martinez
 
Arinbide Adaptativo. Plan de entregas.v1.0
Arinbide Adaptativo. Plan de entregas.v1.0Arinbide Adaptativo. Plan de entregas.v1.0
Arinbide Adaptativo. Plan de entregas.v1.0Ander Martinez
 
Arinbide Adaptativo. Pila de sprint.v1.0
Arinbide Adaptativo. Pila de sprint.v1.0Arinbide Adaptativo. Pila de sprint.v1.0
Arinbide Adaptativo. Pila de sprint.v1.0Ander Martinez
 
Arinbide Adaptativo. Pila de producto.v1.0
Arinbide Adaptativo. Pila de producto.v1.0Arinbide Adaptativo. Pila de producto.v1.0
Arinbide Adaptativo. Pila de producto.v1.0Ander Martinez
 
Arinbide Adaptativo. Pila de impedimentos.v1.1
Arinbide Adaptativo. Pila de impedimentos.v1.1Arinbide Adaptativo. Pila de impedimentos.v1.1
Arinbide Adaptativo. Pila de impedimentos.v1.1Ander Martinez
 
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0Ander Martinez
 
Arinbide Adaptativo. Monitorización.v1.0
Arinbide Adaptativo. Monitorización.v1.0Arinbide Adaptativo. Monitorización.v1.0
Arinbide Adaptativo. Monitorización.v1.0Ander Martinez
 
Arinbide Adaptativo. Manual de usuario.v1.0
Arinbide Adaptativo. Manual de usuario.v1.0Arinbide Adaptativo. Manual de usuario.v1.0
Arinbide Adaptativo. Manual de usuario.v1.0Ander Martinez
 
Arinbide Adaptativo. Diseño técnico.v1.0
Arinbide Adaptativo. Diseño técnico.v1.0Arinbide Adaptativo. Diseño técnico.v1.0
Arinbide Adaptativo. Diseño técnico.v1.0Ander Martinez
 
Arinbide Adaptativo. Defectos y errores .v1.0
Arinbide Adaptativo. Defectos y errores .v1.0Arinbide Adaptativo. Defectos y errores .v1.0
Arinbide Adaptativo. Defectos y errores .v1.0Ander Martinez
 
Arinbide Adaptativo. Acta de reunión.v1.1
Arinbide Adaptativo. Acta de reunión.v1.1Arinbide Adaptativo. Acta de reunión.v1.1
Arinbide Adaptativo. Acta de reunión.v1.1Ander Martinez
 
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0Ander Martinez
 
Arinbide adaptativo.v1.0
Arinbide adaptativo.v1.0Arinbide adaptativo.v1.0
Arinbide adaptativo.v1.0Ander Martinez
 
UDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextualUDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextualAnder Martinez
 
UDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackUDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackAnder Martinez
 
UDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. AutocompleteUDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. AutocompleteAnder Martinez
 
UDA-Componentes RUP. Mensajes (v2.1.1 deprecado)
UDA-Componentes RUP. Mensajes (v2.1.1 deprecado)UDA-Componentes RUP. Mensajes (v2.1.1 deprecado)
UDA-Componentes RUP. Mensajes (v2.1.1 deprecado)Ander Martinez
 
UDA-Anexo uso de webDAV
UDA-Anexo uso de webDAVUDA-Anexo uso de webDAV
UDA-Anexo uso de webDAVAnder Martinez
 

Plus de Ander Martinez (20)

Arinbide Adaptativo. Visión del producto.v1.0
Arinbide Adaptativo. Visión del producto.v1.0Arinbide Adaptativo. Visión del producto.v1.0
Arinbide Adaptativo. Visión del producto.v1.0
 
Arinbide Adaptativo. Retrospectiva.v1.0
Arinbide Adaptativo. Retrospectiva.v1.0Arinbide Adaptativo. Retrospectiva.v1.0
Arinbide Adaptativo. Retrospectiva.v1.0
 
Arinbide Adaptativo. Plan de entregas.v1.0
Arinbide Adaptativo. Plan de entregas.v1.0Arinbide Adaptativo. Plan de entregas.v1.0
Arinbide Adaptativo. Plan de entregas.v1.0
 
Arinbide Adaptativo. Pila de sprint.v1.0
Arinbide Adaptativo. Pila de sprint.v1.0Arinbide Adaptativo. Pila de sprint.v1.0
Arinbide Adaptativo. Pila de sprint.v1.0
 
Arinbide Adaptativo. Pila de producto.v1.0
Arinbide Adaptativo. Pila de producto.v1.0Arinbide Adaptativo. Pila de producto.v1.0
Arinbide Adaptativo. Pila de producto.v1.0
 
Arinbide Adaptativo. Pila de impedimentos.v1.1
Arinbide Adaptativo. Pila de impedimentos.v1.1Arinbide Adaptativo. Pila de impedimentos.v1.1
Arinbide Adaptativo. Pila de impedimentos.v1.1
 
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
Arinbide Adaptativo. Normas, participantes y procedimientos.v1.0
 
Arinbide Adaptativo. Monitorización.v1.0
Arinbide Adaptativo. Monitorización.v1.0Arinbide Adaptativo. Monitorización.v1.0
Arinbide Adaptativo. Monitorización.v1.0
 
Arinbide Adaptativo. Manual de usuario.v1.0
Arinbide Adaptativo. Manual de usuario.v1.0Arinbide Adaptativo. Manual de usuario.v1.0
Arinbide Adaptativo. Manual de usuario.v1.0
 
Arinbide Adaptativo. Diseño técnico.v1.0
Arinbide Adaptativo. Diseño técnico.v1.0Arinbide Adaptativo. Diseño técnico.v1.0
Arinbide Adaptativo. Diseño técnico.v1.0
 
Arinbide Adaptativo. Defectos y errores .v1.0
Arinbide Adaptativo. Defectos y errores .v1.0Arinbide Adaptativo. Defectos y errores .v1.0
Arinbide Adaptativo. Defectos y errores .v1.0
 
Arinbide Adaptativo. Acta de reunión.v1.1
Arinbide Adaptativo. Acta de reunión.v1.1Arinbide Adaptativo. Acta de reunión.v1.1
Arinbide Adaptativo. Acta de reunión.v1.1
 
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
Arinbide adaptativo. Anexo. Conceptos básicos. v1.0
 
Arinbide adaptativo.v1.0
Arinbide adaptativo.v1.0Arinbide adaptativo.v1.0
Arinbide adaptativo.v1.0
 
Arinbide.v3.0
Arinbide.v3.0Arinbide.v3.0
Arinbide.v3.0
 
UDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextualUDA-Componentes RUP. Menú contextual
UDA-Componentes RUP. Menú contextual
 
UDA-Componentes RUP. Feedback
UDA-Componentes RUP. FeedbackUDA-Componentes RUP. Feedback
UDA-Componentes RUP. Feedback
 
UDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. AutocompleteUDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. Autocomplete
 
UDA-Componentes RUP. Mensajes (v2.1.1 deprecado)
UDA-Componentes RUP. Mensajes (v2.1.1 deprecado)UDA-Componentes RUP. Mensajes (v2.1.1 deprecado)
UDA-Componentes RUP. Mensajes (v2.1.1 deprecado)
 
UDA-Anexo uso de webDAV
UDA-Anexo uso de webDAVUDA-Anexo uso de webDAV
UDA-Anexo uso de webDAV
 

Dernier

Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxCarolina Bujaico
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfFernandoOblitasVivan
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaYeimys Ch
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskbydaniela5
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nóminacuellosameidy
 
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.radatoro1
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024anasofiarodriguezcru
 
TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888ElianaValencia28
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdflauralizcano0319
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar24roberto21
 

Dernier (20)

Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptx
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdf
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjskTrabajo de Tecnología .pdfywhwhejsjsjsjsjsk
Trabajo de Tecnología .pdfywhwhejsjsjsjsjsk
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nómina
 
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
TinkerCAD y figuras en 3D. Uso del programa TinkerCAD para crear fuguras.
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024Trabajo de tecnología primer periodo 2024
Trabajo de tecnología primer periodo 2024
 
TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888TECNOLOGIA 11-4.8888888888888888888888888
TECNOLOGIA 11-4.8888888888888888888888888
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdftecnologiaactividad11-240323205859-a9b9b9bc.pdf
tecnologiaactividad11-240323205859-a9b9b9bc.pdf
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar
 

UDA-Migracion a v2

  • 1. UDA – Utilidades de desarrollo de aplicaciones by EJIE is licensed under a Creative Commons Reconocimiento- NoComercial-CompartirIgual 3.0 Unported License. UDA - Utilidades de desarrollo de aplicaciones Migración v2.0.0 Fecha: 22/06/2012 Referencia: EJIE S.A. Mediterráneo, 14 Tel. 945 01 73 00* Fax. 945 01 73 01 01010 Vitoria-Gasteiz Posta-kutxatila / Apartado: 809 01080 Vitoria-Gasteiz www.ejie.es
  • 2. Migración v2.0.0 ii/25 Control de documentación Título de documento: Migración v2.0.0 Histórico de versiones Código: Versión: Fecha: Resumen de cambios: 1.0.0 22/06/2012 Primera versión. Cambios producidos desde la última versión Control de difusión Responsable: Ander Martínez Aprobado por: Firma: Fecha: Distribución: Referencias de archivo Autor: Nombre archivo: Localización:
  • 3. Migración v2.0.0 iii/25 Contenido Capítulo/sección Página 1 Introducción v2.0.0 1 2 Actualización componentes RUP v2.0.0 2 3 Actualización librerías v2.0.0 5 3.1 Dependencias 5 3.2 Ficheros de configuración de Spring 6 4 Configuración idiomática 9 5 Seguridad 13 5.1 Seguridad mediante el uso del Mock 14 5.2 Seguridad mediante el uso de XLNets 17 6 Jackson JSON Processor 18 7 Envío de ficheros desde un mantenimiento 19 8 Validaciones 21 9 Excepciones 22
  • 4. Migración v2.0.0 1/25 1 Introducción v2.0.0 El objetivo de este documento es describir los cambios necesarios a realizar en aplicaciones que se encuentren en fase de desarrollo y que consideren necesario actualizar la versión de las utilidades que proporciona UDA, entendiendo por utilidad los patrones de interacción RUP, la librería de utilidades x38ShLibClasses, las plantillas de generación de código y el plugin para el Eclipse. En el caso de nuevos desarrollos con UDA se recomienda descargar la última versión completa y tenerla como punto de partida. La actualización a la versión v2.0.0 se puede realizar en función de las necesidades de la aplicación, pero se dan por sentados los siguientes supuestos: • La actualización se realiza sobre una aplicación con la versión 1.2.1 de RUP. La actualización directa desde versiones anteriores no ha sido probada por lo que es posible que pueda darse la necesidad de realizar modificaciones extras. • Los ficheros originales de RUP no han sido modificados. En los capítulos siguientes se describe de forma detallada qué cambios habrá que realizar en cada caso y además se referencia a diversos anexos de la documentación para profundizar más en cómo se han implementado y para mostrar ejemplos, además de la propia aplicación x21a que está disponible en el repositorio de código. Una guía básica de qué cambios se deben realizar en cada caso en función de las necesidades de la aplicación sería la siguiente: Si se quiere modificar únicamente los componentes visuales para resolver posibles problemas detectados y/o obtener los componentes para los nuevos patrones desarrollados sin tocar el resto de la aplicación: o Solo es necesario actualizar los patrones RUP. o No es necesario actualizar la librería x38. Los componentes son compatibles con la versión anterior pero no se obtendrá el beneficio de las mejoras practicadas para validaciones y excepciones. Si se quiere actualizar la librería de utilidades para beneficiarse de las mejoras en seguridad, validación, excepciones, gestión idiomática: o Habrá que actualizar los componentes RUP, la librería x38ShLibClasses y realizar los cambios requeridos por su uso, a saber: configuración idiomática y configuración de seguridad. o No es necesario realizar los cambios de validación y excepciones. Si se quieren implementar validaciones en servidor y cliente mediante la nueva versión: o Habrá que actualizar los componentes RUP, la librería x38ShLibClasses, realizar los cambios de gestión idiomática y seguridad, que son obligatorios, y además los cambios del sistema de validación y excepción.
  • 5. Migración v2.0.0 2/25 2 Actualización componentes RUP v2.0.0 Los pasos que se han de realizar para realizar la actualización son los siguientes: 1. Cambiar la carpeta xxxStaticsWebContentrup por la carpeta incluida en el fichero rup-v2.0.0.zip 2. Modificar la inclusión de los ficheros CSS y JS que se detallan a continuación: <xxxYYY>WarWebContent?WEB-INFlayoutsincludesrup.styles.inc Modificar las líneas 7-8: <!-- jQuery UI (custom-theme) --> <link href="${staticsUrl}/rup/custom-theme/jquery-ui-1.8.20.custom.css" rel="stylesheet" type="text/css" /> Modificar las líneas 10-27: <!-- Patrones (basic-theme) --> <link href="${staticsUrl}/rup/basic-theme/theme.rup.base-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.accordion-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.autocomplete-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.breadCrumb-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.combo-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.date-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.feedback-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.grid-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.lang-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.maint-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.menu-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.messages-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.tabs-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.time-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.toolbar-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.tooltip-2.0.0.css" rel="stylesheet" type="text/css" /> Añadir en la línea 28: <link href="${staticsUrl}/rup/basic-theme/theme.rup.validate-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.wizard-2.0.0.css" rel="stylesheet" type="text/css" /> <xxxYYY>WarWebContent?WEB-INFlayoutsincludesrup.scripts.inc Modificar las líneas 3-4. Actualización de la versión de jQuery: <!-- jQuery 1.7.2 --> <script src="${staticsUrl}/rup/scripts/core/jquery-1.7.2.js" type="text/javascript"></script> Modificar las líneas 6-8. Modificar las versiones de rup.utils y rup.base: <!-- RUP-CORE --> <script src="${staticsUrl}/rup/scripts/rup.utils-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.base-2.0.0.js" type="text/javascript"></script>
  • 6. Migración v2.0.0 3/25 Añadir en la línea 9: <script src="${staticsUrl}/rup/scripts/rup.compatibility-2.0.0.js" type="text/javascript"></script> Actualizar la sección de jQuery UI: <!-- jQuery UI 1.8.20--> <script src="${staticsUrl}/rup/scripts/core/ui/jquery-ui-1.8.20.custom.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/jquery-ui.multidatespicker.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/jquery-ui.timepicker.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/jquery.ui.autocomplete.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/jquery.ui.selectmenu.js" type="text/javascript"></script> Actualizar la sección de jqGrid: <!-- jqGrid 4.3.2--> <script src="${staticsUrl}/rup/scripts/core/jqGrid/jqGrid-4.3.2.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/jqGrid/jquery.jqGrid.fluid.js" type="text/javascript"></script> Actualizar la sección de Utilidades adicionales: <!—Utilidades adicionales--> <script src="${staticsUrl}/rup/scripts/core/utils/form2object.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.blockUI.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.fileupload.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.fileupload-ui.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.form.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.iframe-transport.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.json-2.2.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.numeric.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.qtip.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.url.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.validate.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.xdr-transport.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/xbreadcrumbs.js" type="text/javascript"></script> Actualizar las versiones de los ficheros de los patrones RUP: <!-- Patrones RUP --> <script src="${staticsUrl}/rup/scripts/rup.accordion-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.autocomplete-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.breadCrumb-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.combo-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.date-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.dialog-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.feedback-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.grid-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.lang-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.maint-2.0.0.js" type="text/javascript"></script>
  • 7. Migración v2.0.0 4/25 <script src="${staticsUrl}/rup/scripts/rup.menu-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.message-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.tabs-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.time-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.toolbar-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.tooltip-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.upload-2.0.0.js" type="text/javascript"></script> Añadir a continuación las entradas de los nuevos patrones: <script src="${staticsUrl}/rup/scripts/rup.upload-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.validate-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.wizard-2.0.0.js" type="text/javascript"></script> Añadir a continuación la siguiente sección nueva: <!-- Ajustes de compatibilidad de menú--> <script src="${staticsUrl}/rup/scripts/core/jquery-1.7.2.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.core.menu.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.widget.menu.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.position.menu.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.menu.js" type="text/javascript"></script> <script type="text/javascript">widgetMenu = $.noConflict(true);</script>
  • 8. Migración v2.0.0 5/25 3 Actualización librerías v2.0.0 A continuación se van a exponer las modificaciones que se deben realizar para actualizar las versiones de los componentes de servidor que se utilizan en la versión v2.0.0. 3.1 Dependencias La versión v2.0.0 de UDA trae consigo una serie de actualizaciones de las versiones de las librerías que se utilizan. En concreto, las librerías actualizadas son las siguientes: Librerías actualizadas • jackson-core-asl-1.7.2.jar jackson-core-asl-1.9.7.jar • jackson-mapper-asl-1.7.2.jar jackson-mapper-asl-1.9.7.jar • logback-classic-0.9.29.jar logback-classic-1.0.6.jar • logback-core-0.9.29.jar logback-core-1.0.6.jar • spring-aop-3.0.5.RELEASE.jar spring-aop-3.1.1.RELEASE.jar • spring-asm-3.0.5.RELEASE.jar spring-asm-3.1.1.RELEASE.jar • spring-beans-3.0.5.RELEASE.jar spring-beans-3.1.1.RELEASE.jar • spring-context-3.0.5.RELEASE.jar spring-context-3.1.1.RELEASE.jar • spring-context-support-3.0.5.RELEASE.jar spring-context-support-3.1.1.RELEASE.jar • spring-core-3.0.5.RELEASE.jar spring-core-3.1.1.RELEASE.jar • spring-expression-3.0.5.RELEASE.jar spring-expression-3.1.1.RELEASE.jar • spring-jdbc-3.0.5.RELEASE.jar spring-jdbc-3.1.1.RELEASE.jar • spring-orm-3.0.5.RELEASE.jar spring-orm-3.1.1.RELEASE.jar • spring-security-acl-3.0.5.RELEASE.jar spring-security-acl-3.1.0.RELEASE.jar • spring-security-config-3.0.5.RELEASE.jar spring-security-config-3.1.0.RELEASE.jar • spring-security-core-3.0.5.RELEASE.jar spring-security-core-3.1.0.RELEASE.jar • spring-security-taglibs-3.0.5.RELEASE.jar spring-security-taglibs-3.1.0.RELEASE.jar • spring-security-web-3.0.5.RELEASE.jar spring-security-web-3.1.0.RELEASE.jar • spring-tx-3.0.5.RELEASE.jar spring-tx-3.1.1.RELEASE.jar • spring-web-3.0.5.RELEASE.jar spring-web-3.1.1.RELEASE.jar • spring-webmvc-3.0.5.RELEASE.jar spring-webmvc-3.1.1.RELEASE.jar • x38ShLibClasses-1.2.1.jar x38ShLibClasses-2.0.0.jar Librerías añadidas • spring-security-crypto-3.1.0.RELEASE.jar
  • 9. Migración v2.0.0 6/25 Estos son los pasos a seguir para realizar la actualización de las librerías: 1. Actualizar el repositorio de dependencias Maven con la nueva versión 2.0.0, que contiene las nuevas versiones de las librerías [Opcional]. En caso de no realizarlo, el Eclipse se conectará al repositorio de Internet para descargarse las librerías con lo que el proceso será más lento. 2. Actualizar el fichero "pom.xml" del proyecto xxxEAR para dejar acorde las dependencias de las librerías: ... <properties> <org.springframework.version>3.1.1.RELEASE</org.springframework.version> <org.springframework.security.version>3.1.0.RELEASE</org.springframework.security.version> <org.logback.version>1.0.6</org.logback.version> ... <com.ejie.x38.version>2.0.0</com.ejie.x38.version> </properties> ... ... <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.7</version> </dependency> ... ... 3. Cerrar el Eclipse y borrar las librerías del proyecto EAR alojadas en xxxEARAPP_INFlib. 4. Abrir el "build.xml" del proyecto xxxEAR con el editor Ant (botón derecho sobre el fichero, Open With>Ant Editor) 5. Ejecuta la tarea "mavenRunDependencies" (botón derecho sobre la tarea, Run As>Ant Build) actualizando las nuevas librerías xxxEARAPP_INFlib 6. Sobre el proyecto xxxEAR pulsar F5 (Refresh) 3.2 Ficheros de configuración de Spring La actualización de la versión de Spring implica la modificación de los esquemas de los ficheros de configuración. Las modificaciones se deben de llevar a cabo en los siguientes ficheros: • <xxxYYY>EARClasses/src o beanRefContext.xml • <xxxYYY>EARClasses/src/spring o dao-config.xml o log-config.xml o security-config.xml
  • 10. Migración v2.0.0 7/25 o service-config.xml o tx-config.xml • <xxxYYY>War/WebContent/WEB-INF/spring o app-config.xml o log-config.xml o mvc-config.xml o security-config.xml o security-core-config.xml o validation-config.xml En cada uno de estos ficheros se ha de modificar la versión de los esquemas de configuración. La versión debe de modificarse de la 3.0 existente a la 3.1. Como ejemplo mostramos la modificación realizada en el fichero app-config.xml. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd"> <import resource="mvc-config.xml" /> <import resource="log-config.xml"/> <import resource="validation-config.xml"/> <import resource="security-core-config.xml"/> <import resource="security-config.xml"/> </beans> En concreto hay que modificar las líneas
  • 11. Migración v2.0.0 8/25 ... ... http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ... http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ... http://www.springframework.org/schema/context/spring-context-3.0.xsd ... http://www.springframework.org/schema/jee/spring-jee-3.0.xsd ... http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ... http://www.springframework.org/schema/task/spring-task-3.0.xsd" ... ... Por las siguientes: ... ... http://www.springframework.org/schema/aop/spring-aop-3.1.xsd ... http://www.springframework.org/schema/beans/spring-beans-3.1.xsd ... http://www.springframework.org/schema/context/spring-context-3.1.xsd ... http://www.springframework.org/schema/jee/spring-jee-3.1.xsd ... http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ... http://www.springframework.org/schema/task/spring-task-3.1.xsd" ... ...
  • 12. Migración v2.0.0 9/25 4 Configuración idiomática El capítulo que nos ocupa pretende recopilar los cambios a realizar en una aplicación para utilizar la nueva gestión de idioma implementada en esta versión. Se puede ver más en detalle como se ha implementado esta gestión en el anexo Gestión idiomática. A continuación se detalla proyecto a proyecto los cambios necesarios (en el siguiente capítulo se detallará las mejoras aportadas con dichos cambios): <xxxConfig> o xxx.properties: Contiene variables para la gestión del idioma y del layout que ya no se utilizan ya que se declaran a nivel de War en su mvc-config.xml, por lo que podrían eliminarse. x21aPilotoPatronesWar.default.language=es x21aPilotoPatronesWar.default.layout=horizontal <xxxEAR> o Sustituir la librería de x38 por la nueva versión x38ShLibClasses-2.0.0.jar <xxxEARClasses> o Modificar el fichero service-config.xml el bean appMessageSource añadiendo las líneas destacadas. <bean id="appMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="x21a.i18n" /> <property name="defaultEncoding" value="UTF-8" /> <<<<propertypropertypropertyproperty namenamenamename===="useCodeAsD"useCodeAsD"useCodeAsD"useCodeAsDefaultMessage"efaultMessage"efaultMessage"efaultMessage" valuevaluevaluevalue===="true""true""true""true" />/>/>/> <<<<propertypropertypropertyproperty namenamenamename===="fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale" valuevaluevaluevalue===="false""false""false""false" />/>/>/> </bean> <xxxNombreWAR> o Modificar el fichero mvc-config.xml el bean messageSource añadiendo las líneas destacadas. <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="parentMessageSource" ref="appMessageSource" /> <property name="basename" value="/WEB-INF/resources/x21aMantenimientos.i18n" /> <property name="defaultEncoding" value="UTF-8" /> <<<<propertypropertypropertyproperty namenamenamename===="useCodeAsDefaultMessage""useCodeAsDefaultMessage""useCodeAsDefaultMessage""useCodeAsDefaultMessage" valuevaluevaluevalue===="true""true""true""true" />/>/>/> <<<<propertypropertypropertyproperty namenamenamename===="fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale" valuevaluevaluevalue===="false""false""false""false" />/>/>/> </bean>
  • 13. Migración v2.0.0 10/25 o Modificar el fichero mvc-config.xml para sustituir el antiguo interceptor por el nuevo. Teniendo en cuenta que ahora las propiedades del fichero xxx.properties para la gestión de idioma por defecto y layout se configuran mediante propiedades del interceptor. [Viejo] <!-- Configures Handler Interceptors --> <mvc:interceptors> <!-- Changes the locale when a 'locale' request parameter is sent;e.g./?locale=en --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> </mvc:interceptors> <!-- Saves a locale change using a cookie --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <property name="cookieName"> <value>language</value> </property> </bean> [Nuevo] <mvc:interceptors> <ref bean="mvcInterceptor"/> </mvc:interceptors> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <property name="cookieName" value="language" /> </bean> <bean id="mvcInterceptor" class="com.ejie.x38.control.MvcInterceptor"> <property name="defaultLanguage" value="es" /> <property name="defaultLayout" value="horizontal" /> <property name="availableLangs" value="es,eu,en,fr" /> </bean> o Modificar el fichero mvc-config.xml para añadir las nuevas clases de resolución de vista incluídas en x38. [Viejo] <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" /> </bean>
  • 14. Migración v2.0.0 11/25 [Nuevo] <bean id="viewResolver" class="com.ejie.x38.control.view.UdaViewResolver"> <property name="viewClass" value="com.ejie.x38.control.view.UdaTilesView"/> <property name="exposedContextBeanNames" > <list> <value>localeResolver</value> <value>mvcInterceptor</value> </list> </property> </bean> o Modificar el fichero base-includes.jsp para cambiar las variables utilizadas en la configuración del idioma para RUP: [Viejo] <script type="text/javascript"> APP_RESOURCES = 'x21a', CTX_PATH = '<%= request.getContextPath()%>/', RUP = '${staticsUrl}/rup', STATICS = '${staticsUrl}', DEFAULT_LANGUAGE =DEFAULT_LANGUAGE =DEFAULT_LANGUAGE =DEFAULT_LANGUAGE = "${defaultLanguage}""${defaultLanguage}""${defaultLanguage}""${defaultLanguage}",,,, LAYOUT = "${defaultLayout}", WAR_NAME = "x21aPilotoPatrones", AVAILABLE_LANGS =AVAILABLE_LANGS =AVAILABLE_LANGS =AVAILABLE_LANGS = "es, eu, en, fr""es, eu, en, fr""es, eu, en, fr""es, eu, en, fr";;;; </script> [Nuevo] <script type="text/javascript"> APP_RESOURCES = 'x21a', CTX_PATH = '<%= request.getContextPath()%>/', STATICS = '${staticsUrl}', RUP = '${staticsUrl}/rup', WAR_NAME = "x21aPilotoPatrones", //model//model//model//model LAYOUT = "${defaultLayout}", //mvc//mvc//mvc//mvc----config.xmlconfig.xmlconfig.xmlconfig.xml AVAILABLE_LANGS = "$AVAILABLE_LANGS = "$AVAILABLE_LANGS = "$AVAILABLE_LANGS = "${mvcInterceptor.availableLangs}",{mvcInterceptor.availableLangs}",{mvcInterceptor.availableLangs}",{mvcInterceptor.availableLangs}", LOCALE_COOKIE_NAME =LOCALE_COOKIE_NAME =LOCALE_COOKIE_NAME =LOCALE_COOKIE_NAME = "${locale_cookieName}""${locale_cookieName}""${locale_cookieName}""${locale_cookieName}";;;; LOCALE_PARAM_NAME =LOCALE_PARAM_NAME =LOCALE_PARAM_NAME =LOCALE_PARAM_NAME = "${locale_paramName}""${locale_paramName}""${locale_paramName}""${locale_paramName}";;;; </script> DEFAULT_LANGUAGE (deprecated): Ahora se carga desde el mvc-config.xml LOCALE_COOKIE_NAME: Nombre de la cookie (definida en mvc-config.xml) LOCALE_PARAM_NAME: Nombre del parámetro de cambio de idioma (definida en mvc-config.xml)
  • 15. Migración v2.0.0 12/25 AVAILABLE_LANGS: Posibles lenguajes de la aplicación (definidos en mvc- config.xml) <xxxStatics> o Modificar en el fichero _layoutLoader.js (existe uno por cada War) para cambiar la invocación del componente rup.language [en caso de que se utilice] utilizando la variable definida. [Viejo] $("#x21aPilotoPatronesWar_language").rup_language({languages: ["es", "eu", "en", "fr"]}); [Nuevo] $("#x21aMantenimientosWar_language").rup_language({languages: $.rup.AVAILABLE_LANGS_ARRAY$.rup.AVAILABLE_LANGS_ARRAY$.rup.AVAILABLE_LANGS_ARRAY$.rup.AVAILABLE_LANGS_ARRAY});
  • 16. Migración v2.0.0 13/25 5 Seguridad La actualización a la versión v2.0.0 de UDA requiere de una serie de ajustes en el componente de seguridad. Las modificaciones son diferentes dependiendo si se está utilizando el Mock de seguridad o el provider de XLNets. En cualquiera de los dos casos es necesario realizar una serie de ajustes en el fichero de configuración común security-core-config.xml. Este fichero se define a nivel de War por lo que estas modificaciones deberán realizarse tantas veces como módulos web disponga la aplicación. Así pues, se deberá sustituir la definición del bean springSecurityFilterChain existente: <bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> <security:filter-chain-map path-type="ant"> <security:filter-chain pattern="/error" filters="none"/> <security:filter-chain pattern="/accesRefused" filters="none"/> <security:filter-chain pattern="**" filters=" exceptionTranslationFilter, securityContextPersistenceFilter, logoutFilter, preAuthenticateProcessingFilter, filterSecurityInterceptor" /> <security:filter-chain pattern="/**" filters=" exceptionTranslationFilter, securityContextPersistenceFilter, logoutFilter, preAuthenticateProcessingFilter, filterSecurityInterceptor" /> </security:filter-chain-map> </bean> La nueva configuración será la siguiente: <bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> <security:filter-chain-map request-matcher="regex"> <security:filter-chain pattern="/mockLoginPage.*" filters="none"/> <security:filter-chain pattern="/mockLoginAjaxPage.*" filters="none"/> <security:filter-chain pattern="/error.*" filters="none"/> <security:filter-chain pattern="/accessDenied.*" filters="none"/> <security:filter-chain pattern="**" filters=" exceptionTranslationFilter, securityContextPersistenceFilter, logoutFilter, preAuthenticateProcessingFilter, filterSecurityInterceptor" /> </security:filter-chain-map> </bean>
  • 17. Migración v2.0.0 14/25 Del mismo modo, se deberá modificar la inicialización del bean myLogoutHandler eliminando la inicialización de la propiedad invalidateXlnetSession: <property name="invalidateXlnetSession" value="false" /> Y añadiendo la nueva para la propiedad invalidateUserSession. La declaración final sería la siguiente: <bean id="myLogoutHandler" class="com.ejie.x38.security.MyLogoutHandler"> <property name="perimetralSecurityWrapper" ref="perimetralSecurityWrapper" /> <property name="invalidateHttpSession" value="true" /> <property name="invalidateUserSession" value="true" /> </bean> 5.1 Seguridad mediante el uso del Mock En aquellos desarrollos en los que se esté haciendo uso del mock para simular XLNets cuando la aplicación no está desplegada en Ejie, habrá que realizar las siguientes modificaciones en el fichero security-config.xml del War: Se deberá modificar la configuración del perimetralSecurityWrapper. [Configuración anterior] <bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperMockImpl"> <property name="principal" value="USER_UDA" /> <property name="roles"> <list> <value>UDA</value> </list> </property> <property name="uidSession" value="1290789636844" /> </bean> [Configuración nueva] <bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperMockImpl"> <property name="principal"> <list> <map> <entry key="userName" value="USER_UDA"/> <entry key="nif" value="12121212j"/> <entry key="policy" value="1"/> <entry key="position" value="01"/> <entry key="isCertificate" value="no"/> <entry key="roles"> <list>
  • 18. Migración v2.0.0 15/25 <value>UDA</value> </list> </entry> </map> </list> </property> <property name="userChangeUrl" value="http://desarrollo.jakina.ejiedes.net:7001/x21aMantenimientosWar/"/> </bean> La nueva implementación permite especificar diferentes usuarios indicando para cada uno de ellos una configuración de seguridad diferente. Estos usuarios son definidos mediante una lista con la que realizará la inicialización de la propiedad principal. De este modo es posible disponer de una serie de usuarios entre los cuales se podrá seleccionar uno de ellos para hacer login al acceder a la aplicación. De este modo para realizar la migración de la configuración de usuarios existente, se deberá de crear por cada usuario una entrada en la lista con la que se inicializa la propiedad principal. <property name="principal"> <list> <!-- Usuario 1 --> <map> <entry key="userName" value="USER_1"/> ... <entry key="roles"> <list> <value>ROLE_1</value> <value>XXX-IN-0001</value> ... </list> </entry> </map> <!-- Usuario 2 --> <map> <entry key="userName" value="USER_2"/> ... <entry key="roles"> <list> <value>ROLE_1</value> <value>XXX-IN-0002</value> <value>XXX-IN-0003</value> ... </list> </entry> </map> </list> </property> Además de la incorporación de múltiples usuarios, el Mock ofrece la posibilidad de definir una url, la propiedad userChangeLog, que determina la URL a la que debe ir la aplicación si el usuario logado cambia sin previo
  • 19. Migración v2.0.0 16/25 aviso. Esta nueva propiedad, simula el comportamiento que también tiene XLNets para evitar cambios de usuarios en mitad de una ejecución y evitar posibles inconsistencias de identidad (accesos anómalos). Las siguientes modificaciones que se han de realizar son para incluir una página de login simulará el registro de usuarios en la aplicación. Proyecto WEB: • xxxYYYWar/WebContent/WEB-INF/layouts/templateLogin.jsp • xxxYYYWar/WebContent/WEB-INF/layouts/includes/mockLoginPage.styles.inc • xxxYYYWar/WebContent/WEB-INF/views/mockLogin/mockLoginAjaxPage.jsp • xxxYYYWar/WebContent/WEB-INF/views/mockLogin/mockLoginPage.jsp • xxxYYYWar/WebContent/WEB-INF/views/mockLogin/mockLoginPage-includes.jsp Proyecto de estáticos: • xxxYYYStatics/WebContent/<xxx>/scripts/<xxxYYY>/mockLoginPage.js • xxxYYYStatics/WebContent/<xxx>/styles/mockLoginPage.css Estos ficheros se pueden encontrar tanto en la aplicación de ejemplo como en el fichero adjunto disponibles en la web de UDA. Una vez incorporados los nuevos ficheros a la aplicación, es necesario realizar las siguientes modificaciones. En el fichero tiles.xml se deben añadir las entradas correspondientes a la template del mock y a la propia entrada de la página de login. <definition name="templateLogintemplateLogintemplateLogintemplateLogin" template="/WEB-INF/layouts/templateLogin.jsp"> <put-attribute name="header" value="/WEB-INF/layouts/header.jsp"/> <put-attribute name="language" value="/WEB-INF/layouts/language.jsp"/> <put-attribute name="breadCrumb" value="/WEB-INF/layouts/breadCrumb.jsp" /> <put-attribute name="footer" value="/WEB-INF/layouts/footer.jsp"/> <put-attribute name="base-includes" value="/WEB-INF/layouts/base-includes.jsp"/> <put-attribute name="includes" value=""/> </definition> <definition name="mockLoginPagemockLoginPagemockLoginPagemockLoginPage" extends="templateLogin"> <put-attribute name="content" value="/WEB-INF/views/mockLogin/mockLoginPage.jsp"/> <put-attribute name="includes" value="/WEB-INF/views/mockLogin/mockLoginPage-includes.jsp"/> </definition> <definition name="mockLoginAjaxPagemockLoginAjaxPagemockLoginAjaxPagemockLoginAjaxPage" template="/WEB-INF/views/mockLogin/mockLoginAjaxPage.jsp"/> En el fichero mvc-config.xml se deben añadir los mapeos correspondientes para el login: <mvc:view-controller path="/mockLoginPage" view-name="mockLoginAjaxPage" /> <mvc:view-controller path="/mockLoginAjaxPage" view-name="mockLoginAjaxPage" />
  • 20. Migración v2.0.0 17/25 La página de login del mock hace uso de una serie de literales internacionalizados que se deben añadir en los ficheros de i18n de la aplicación. La lista de literales de los que hace uso es la siguiente: ... app.title=Uda mockLogin.selectUser=Elija un Usuario mockLogin.selectedUser=Usuario seleccionado: mockLogin.login_button=Iniciar Sesión logOut.disconnect=Desconectar ... 5.2 Seguridad mediante el uso de XLNets Para usar Xlnets como sistema de seguridad a partir de la versión v.2.0.0, hay que modificar la declaración del bean perimetralSecurityWrapper en el fichero de configuración de Spring security-config.xml. [Viejo] <bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperN38Impl"> <property name="xlnetCachingPeriod" value="120" /> </bean> [Nuevo] <bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperN38Impl"> <property name="xlnetCachingPeriod" value="120" /> <property name="userChangeUrl" value="/x21aPilotoPatronesWar/" /> <property name="anonymousCredentials"> <map> <entry key="userProfiles" value="UDA" /> <!-- entry key="userProfiles" value="udaAnonymousProfile" /--> <entry key="position" value="udaAnonymousPosition" /> </map> </property> </bean>
  • 21. Migración v2.0.0 18/25 6 Jackson JSON Processor Al desarrollar la versión v2.0.0 se ha tratado de mantener el mayor grado de retrocompatibilidad con las implementaciones existentes en las aplicaciones que hacen uso del componente de Jackson. Los desarrollos que hacen uso de las funcionalidades del componente Jackson incluido en las versiones anteriores a la v2.0.0 de UDA son compatibles siempre y cuando no se hayan utilizado funcionalidades deprecadas en la nueva versión de Jackson. Sin embargo en la nueva versión de Jackson se han implementado una serie de nuevas funcionalidades que mejoran y potencian los procesos de serialización y deserialización. Del mismo modo, se facilita la configuración de ambos procesos permitiendo una mayor flexibilidad en su uso. Para que las aplicaciones puedan beneficiarse de estas mejoras es necesario realizar una serie de ajustes en la configuración de Jackson. Así pues, a pesar de que no es estrictamente necesaria la actualización para que la aplicación siga funcionando de manera correcta, si se recomienda llevarla a cabo para mejorar el proceso de desarrollo. Por supuesto esta decisión se deberá tomar de acuerdo a las necesidades puntuales y el grado de desarrollo de las aplicaciones. El proceso de actualización completo se puede encontrar en el anexo Configuración y uso de Jackson. De todos modos es necesario indicar que existe una característica de Jackson que ha variado su funcionamiento y que requiere de un ajuste en la implementación existente. En versiones posteriores a Jackson 1.9, la anotación @JsonIgnore podía ser utilizada a nivel de método (ej. un método getter de una propiedad). A partir de la versión 1.9 es posible anotar un método pero se toma como una anotación de propiedad. Es decir si estamos anotando el método getter mediante @JsonIgnore, esta propiedad no solo se ignorará en el proceso de serialización sino que también será obviada al realizar la deserialización. Debido a esto es necesario modificar el código existente para utilizar la anotación @JsonProperty(“propiedad”) en el método que queremos que conserve su funcionalidad. Como ejemplo, en el siguiente código realizaremos las anotaciones correspondientes para que la clave de acceso de un alumno no sea procesada durante la serialización pero si en la deserialización. En el código existente solo existiría la anotación @JsonIgnore para evitar la serialización de la propiedad. Con la actualización a la nueva versión de Jackson, se deberá de añadir la anotación resaltada en el setter, @JsonProperty(“password”), para que se continúe realizando la deserialización. publicpublicpublicpublic classclassclassclass Alumno implementsimplementsimplementsimplements java.io.Serializable { privateprivateprivateprivate BigDecimal id; privateprivateprivateprivate String nombre; privateprivateprivateprivate String apellido1; privateprivateprivateprivate String apellido2; privateprivateprivateprivate String password; // Getters y setters de las propiedades @JsonIgnore publicpublicpublicpublic String getPassword() { returnreturnreturnreturn thisthisthisthis.password; } @JsonProperty@JsonProperty@JsonProperty@JsonProperty(((("password""password""password""password")))) publicpublicpublicpublic voidvoidvoidvoid setPassword(String password) { thisthisthisthis.password = password; } }
  • 22. Migración v2.0.0 19/25 7 Envío de ficheros desde un mantenimiento En actualización de las versiones de Spring y de las librerías jQuery se han introducido una serie de mejoras y modificaciones en sus funcionalidades. Estos cambios implican realizar una serie de ajustes en el proceso de subida de archivos pero conllevan una simplificación y optimización del mismo. Las mejoras logradas en el proceso son las siguientes: • Se posibilita el envío de ficheros mediante peticiones PUT y POST, dependiendo del tipo de operación que sea (edición o inserción). En la anterior versión de Spring no se permitía el envío de ficheros mediante una petición de tipo multipart/form-data utilizando un método HTTP PUT. • Se elimina la necesidad de utilizar las cabeceras que indican el tipo de operación que se está realizando en las peticiones del mantenimiento. • Las peticiones en las que esté involucrado un campo file se realizan siempre del mismo modo, independientemente de si se haya seleccionado un fichero o no. Esto simplifica la gestión de peticiones en los controllers. La característica principal que permite esta serie de mejoras es la posibilidad de realizar un envío de ficheros mediante PUT. Esto es debido a que en la versión 3.1.1 de Spring se han realizado modificaciones en la clase RequestParamMethodArgumentResolver que permiten que las peticiones multipart/form-data puedan ser realizadas mediante una petición PUT. Aun así, la clase CommonsMultipartResolver encargada de gestionar las peticiones multipart/form-data sigue limitando que estas peticiones deban ser realizadas mediante peticiones POST. Para evitar esto se ha creado una clase UdaMultipartResolver que extiende de la anterior sobrescribiendo el método de comprobación de una petición multipart válida. La modificación en la configuración de Spring se deberá realizar en el fichero mvc-config.xml definido a nivel de War, por lo que se deberá realizar esta modificación tantas veces como módulos web, en los que se realice subida de ficheros, disponga la aplicación. El cambio supone sustituir el uso del CommonsMultipartResolver por el nuevo UdaMultipartResolver: [Viejo] <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> [Nuevo] <bean id="multipartResolver" class="com.ejie.x38.util.UdaMultipartResolver"/> El siguiente paso será modificar en los controllers los métodos encargados de procesar las peticiones de envío de ficheros. NOTA: Solamente deberán modificarse los métodos involucrados en el proceso del envío de ficheros. En el envío de ficheros desde un formulario de detalle de un mantenimiento se deberán modificar los métodos que procesan la inserción y modificación de un elemento. En el siguiente código se muestran resaltadas las modificaciones a realizar en las anotaciones de mapeo de peticiones de los métodos de los controllers. Con la nueva versión el método de edición de un elemento se
  • 23. Migración v2.0.0 20/25 mapeará con peticiones que utilicen el método HTTP PUT. En ambos métodos se elimina el uso de la cabecera rup_maint_mode en la petición. [Viejo] @RequestMapping@RequestMapping@RequestMapping@RequestMapping((((method = RequestMethod.method = RequestMethod.method = RequestMethod.method = RequestMethod.POSTPOSTPOSTPOST, headers=, headers=, headers=, headers="rup_maint_mode=add""rup_maint_mode=add""rup_maint_mode=add""rup_maint_mode=add")))) publicpublicpublicpublic @ResponseBody PerfilUsuario add( @ModelAttribute PerfilUsuario perfilUsuario, @RequestParam(value="imagen", required=false)MultipartFile imagen, HttpServletResponse response) { // Implementación de la funcionalidad del método } @RequestMapping@RequestMapping@RequestMapping@RequestMapping(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.POSTPOSTPOSTPOST, headers=, headers=, headers=, headers="rup_maint_mode=edit""rup_maint_mode=edit""rup_maint_mode=edit""rup_maint_mode=edit")))) publicpublicpublicpublic @ResponseBody PerfilUsuario edit( @ModelAttribute PerfilUsuario perfilUsuario, @RequestParam(value="imagen", required=false)MultipartFile imagen, HttpServletResponse response) { // Implementación de la funcionalidad del método } [Nuevo] @RequestMapping@RequestMapping@RequestMapping@RequestMapping(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.POSTPOSTPOSTPOST)))) publicpublicpublicpublic @ResponseBody PerfilUsuario add( @ModelAttribute PerfilUsuario perfilUsuario, @RequestParam(value="imagen", required=false)MultipartFile imagen, HttpServletResponse response) { // Implementación de la funcionalidad del método } @RequestMapping@RequestMapping@RequestMapping@RequestMapping(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.PPPPUTUTUTUT)))) publicpublicpublicpublic @ResponseBody PerfilUsuario edit( @ModelAttribute PerfilUsuario perfilUsuario, @RequestParam(value="imagen", required=false)MultipartFile imagen, HttpServletResponse response) { // Implementación de la funcionalidad del método }
  • 24. Migración v2.0.0 21/25 8 Validaciones La nueva versión v2.0.0 de UDA conlleva una profunda remodelación en el sistema de validaciones. Mediante el nuevo sistema se ha buscado reducir el impacto de implementaciones propias en la gestión de validaciones y tratar de dar una solución basada en la especificación JSR-303 para validaciones de beans. Se ha desarrollado también un sistema de validaciones en cliente para tratar de maximizar el rendimiento de las aplicaciones en este aspecto. Para ello se ha tratado de simplificar y optimizar la comunicación del resultado de los procesos de validación entre las partes servidor y cliente. Debido a estos cambios se deben realizar una serie de ajustes para poder beneficiarse de las funcionalidades y mejoras del nuevo sistema de validaciones. Estas modificaciones se detallan en el anexo Gestión de validaciones. De todos modos y buscando no perjudicar a las implementaciones existentes, se ha mantenido una retrocompatibilidad completa con el sistema de validaciones existente, por lo que en caso de no ser necesario el uso de las nuevas funcionalidades no es obligatorio acometer las actualización a la nueva versión.
  • 25. Migración v2.0.0 22/25 9 Excepciones La nueva versión v2.0.0 de UDA presenta una nueva gestión de excepciones. Las aplicaciones desarrolladas con versiones anteriores UDA contaban con una serie de excepciones por defecto dentro de la librería x38. Mediante el uso de estas clases se conseguía una gestión homogénea en todas las aplicaciones, pero era labor del desarrollador la gestión de cada excepción de la aplicación. A partir de la versión v.2.0.0 la gestión independiza el código de las clases (ya sean controllers, services o daos) de las excepciones ya que éstas se gestionan a través de una clase externa denominada handler (en caso de necesidad también se podría realizar la gestión en el propio controller). La generación de código mediante el plugin UDA aporta un handler genérico que realiza la gestión por defecto de las excepciones pero será labor del desarrollador decidir si quiere realizar una gestión particular de cierto tipo de excepciones. El uso de este nuevo sistema de excepciones necesita de una serie de modificaciones para migrar a la nueva gestión. El proceso de migración se detalla en el anexo Gestión de excepciones. De todos modos y buscando no perjudicar a las implementaciones existentes, se ha mantenido una retrocompatibilidad completa con el sistema de excepciones existente, por lo que en caso de no ser necesario el uso de las nuevas funcionalidades no es obligatorio acometer las actualización a la nueva versión.