Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

...

Está página es una guía para la migración de aplicaciones Spring-Boot al parent FundeWebJS .
Con esto se consigue simplificar la configuración de los proyectos y centralizar el versionado de las librerías de Spring-Boot.

Tabla de contenidos
outlinetrue

Guía detallada


Info

El parent de FundeWebJS se ha desarrollado con la versión de Spring-Boot 2.7.10.

...

1. Fichero pom.xml

    1. Sustituir la etiqueta <parent> completa por:

      Bloque de código
      languagexml
      	<parent>
      		<groupId>es.um.atica</groupId>
      		<artifactId>fundewebjs-api-parent</artifactId>
      		<version>1.0.2</version>
      		<relativePath>../pom.xml</relativePath>
      	</parent>


    2.  En la etiqueta groupId de la aplicación, añadir "fundewebjs" a "<groupId>es.um.atica</groupId>". Por ejemplo, para la aplicación api-base quedaría:

      Bloque de código
      languagexml
      	<groupId>es.um.atica.fundewebjs</groupId>
      	<artifactId>api-base</artifactId>


    3. En la etiqueta <properties> dejar las siguientes:

      Bloque de código
      languagexml
       	<properties>
      		<java.version>11</java.version>
      		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      	</properties>

      Si la aplicación tenía otras propiedades configuradas, habrá que valorar si siguen siendo necesarias teniendo en cuenta que la mayoría de las dependencias y versiones están fijadas por la librería fundewebjs-spring-boot-starter .
      Se recomienda quitarlas todas e ir añadiendo posteriormente solo las necesarias cuando se traten las dependencias en el apartado e .

      Advertencia

      (menos) NUNCA deben configurarse las propiedades de versiones de spring-boot o spring-cloud . (menos)


    4. Si existe la etiqueta <dependencyManagement> sustituir por el siguiente código. Si no existe, añadirla:

      Bloque de código
      languagexml
      	<dependencyManagement>
      		<dependencies>
      			<dependency>
      				<groupId>org.springframework.boot</groupId>
      				<artifactId>spring-boot-dependencies</artifactId>
      				<version>${spring-boot.version}</version>
      				<type>pom</type>
      				<scope>import</scope>
      			</dependency>
      		</dependencies>
      	</dependencyManagement>


      Como se ha mencionado en el apartado anterior, la mayoría de dependencias necesarias vienen ya incluidas con fundewebjs-spring-boot-starter.
      Si nuestro pom.xml incluía en dependencyManagement la dependencia de spring-cloud, se recomienda eliminarla y terminar la configuración del pom.xml.

      Si finalmente fuera necesario, se puede incluir el bom de spring-cloud dentro de dependencyManagement exactamente así:

      Bloque de código
      languagexml
      		<dependency>
      			<groupId>org.springframework.boot</groupId>
      			<artifactId>spring-boot-dependencies</artifactId>
      			<version>${spring-boot.version}</version>
      			<type>pom</type>
      			<scope>import</scope>
      		</dependency>



    5. En la etiqueta <dependencies> la mayoría de las dependencias ya no van a ser necesarias.
      Se recomienda copiar todas las dependencias a un fichero .txt aparte y sustituir toda la etiqueta por:

      Bloque de código
      languagexml
      	<dependencies>
      		<dependency>
      			<groupId>es.um.atica</groupId>
      			<artifactId>fundewebjs-spring-boot-starter</artifactId>
      		</dependency>
      	</dependencies>


      Esta dependencia engloba todas las librerías necesarias para trabajar con una aplicación FundeWebJS estándar.



      Después de este cambio se aconseja realizar un maven update project con force.
      Si hay errores en el código, se recomienda revisar el fichero .txt con las dependencias antiguas y añadir la que sea necesaria.


      Info

      Este es el apartado más complicado de la migración, en caso de dudas sobre las librerías poner Jira a DJ-AT-MNCS como se indica al final de esta guía.


    6. En la etiqueta <build> configurar los siguientes plugins:

      Bloque de código
      languagexml
         	<build>
      		<plugins>
      			<plugin>
      				<groupId>org.hibernate.orm.tooling</groupId>
      				<artifactId>hibernate-enhance-maven-plugin</artifactId>
      			</plugin>
      			<plugin>
      				<groupId>org.jacoco</groupId>
      				<artifactId>jacoco-maven-plugin</artifactId>
      			</plugin>
      			<plugin>
      				<groupId>org.springframework.boot</groupId>
      				<artifactId>spring-boot-maven-plugin</artifactId>
      			</plugin>
      		</plugins>
      	</build>


      Info

      Si el plugin para generar clientes SOAP estaba configurado, <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId>, hay que mantenerlo configurado tal cuál estaba.


    7. En la etiqueta <repositories> configurar el repositorio de archiva de fundewebjs:

      Bloque de código
      languagexml
      	<repositories>
      		<repository>
      			<id>fundewebjs-archiva</id>
      			<name>ATICA - UMU Repository - FundeWebJS</name>
      			<url>https://archiva.um.es/archiva/repository/FundeWebJS/</url>
      		</repository>
      	</repositories>


    8. Una vez realizados estos pasos, realizar un maven update project con la casilla Force Update of Snapshots/Releases marcada.

      Ejemplo de pom.xml migrado:

      Bloque de código
      languagexml
      themeEclipse
      firstline1
      titleEjemplo pom.xml
      linenumberstrue
      collapsetrue
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      	<modelVersion>4.0.0</modelVersion>
      	<parent>
      		<groupId>es.um.atica</groupId>
      		<artifactId>fundewebjs-api-parent</artifactId>
      		<version>1.0.2</version>
      		<relativePath>../pom.xml</relativePath>
      	</parent>
      
      	<groupId>es.um.atica.fundewebjs</groupId>
      	<artifactId>acade-api-certificados</artifactId>
      	<version>0.0.1-SNAPSHOT</version>
      	<name>acade-api-api</name>
      	<description>Acade API Certificados</description>
         
         	<properties>
      		<java.version>11</java.version>
      		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      	</properties>
         
      	<dependencyManagement>
      		<dependencies>
      			<dependency>
      				<groupId>org.springframework.boot</groupId>
      				<artifactId>spring-boot-dependencies</artifactId>
      				<version>${spring-boot.version}</version>
      				<type>pom</type>
      				<scope>import</scope>
      			</dependency>
      		</dependencies>
      	</dependencyManagement>
      	
      	<dependencies>
      		<dependency>
      			<groupId>es.um.atica</groupId>
      			<artifactId>fundewebjs-spring-boot-starter</artifactId>
      		</dependency>
      	</dependencies>
      
      	<repositories>
      		<repository>
      			<id>fundewebjs-archiva</id>
      			<name>ATICA - UMU Repository - FundeWebJS</name>
      			<url>https://archiva.um.es/archiva/repository/FundeWebJS/</url>
      		</repository>
      	</repositories>
      
      	<build>
      		<plugins>
      			<plugin>
      				<groupId>org.hibernate.orm.tooling</groupId>
      				<artifactId>hibernate-enhance-maven-plugin</artifactId>
      			</plugin>
      			<plugin>
      				<groupId>org.jacoco</groupId>
      				<artifactId>jacoco-maven-plugin</artifactId>
      			</plugin>
      			<plugin>
      				<groupId>org.springframework.boot</groupId>
      				<artifactId>spring-boot-maven-plugin</artifactId>
      			</plugin>
      
      			<!-- SOAP -->
      			<plugin>
      				<groupId>org.jvnet.jaxb2.maven2</groupId>
      				<artifactId>maven-jaxb2-plugin</artifactId>
      				<version>0.14.0</version>
      				<executions>
      					<execution>
      						<goals>
      							<goal>generate</goal>
      						</goals>
      					</execution>
      				</executions>
      				<configuration>
      					<args>
      						<arg>-XautoNameResolution</arg>
      					</args>
      					<schemaLanguage>WSDL</schemaLanguage>
      					<generateDirectory>${project.basedir}/src/main/java</generateDirectory>
      					<generatePackage>es.um.atica.acade-api.soap.gen</generatePackage>
      					<schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
      					<schemaIncludes>
      						<include>ServicioRegistroUMU.wsdl</include>
      					</schemaIncludes>
      				</configuration>
      			</plugin>
      		</plugins>
      	</build>
      </project>


...

De cara la migración hay que realizar la siguiente configuración:
1
a. En caso de no estar configurado ya, añadir el paquete "es.um.atica.fundewebjs" al parámetro scanBasePackages de la anotación @SpringBootApplication. :

...

Si tenemos una clase CorsConfig o un método 

...

método CorsConfigurationSource corsConfigurationSource() en una clase con @Configuration con el siguiente contenido:

Bloque de código
languagejava
CorsConfigurationSource corsConfigurationSource() {


		final CorsConfiguration configuration = new CorsConfiguration();
		configuration.setAllowedOriginPatterns( Arrays.asList( "*" ) );
		configuration.setAllowedMethods( Arrays.asList( "*" ) );
		configuration.setAllowedHeaders( Arrays.asList( "*" ) );
		configuration.setAllowCredentials( true );
		final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
		source.registerCorsConfiguration( "/**", configuration );
		return source;
}


a. Hay que eliminar la clase CorsConfig  o el método corsConfigurationSource. (lo que exista).

Info

Esta configuración, a partir de ahora, se realizará con la clase FundeWebJSCorsConfig de la librería fundewebjs-spring-boot-starter.
Si se quiere modificar la configuración por defecto, puede mantenerse en el proyecto y poner en el application.properties la propiedad: fdwjs.starter.cors.enable=false.


...


4. Configuración Security.

Si tenemos una clase SecurityConfig con la siguiente configuración:

Bloque de código
languagejava
titleSecurityConfig
################# En versiones de Spring-Boot anteriores a 2.7
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Value( "${server.scopes}" )
    private String[] serverScopes;
 
    @Value( "${app.server.path}" )
    private String apiPath;
 
    @Bean
    public FundeWebJSLoggingAuthorizationFilter loggingFilterBean() {
       return new FundeWebJSLoggingAuthorizationFilter();
    }
 
    @Override
    protected void configure( HttpSecurity http ) throws Exception {
        http.requestMatchers().antMatchers( "/public/**" ).and().requestMatchers().antMatchers( apiPath + "/**" ).and()
        .sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS )
        // configuro politica de sesion sin estado
        .and().cors() // Aniado configuracion CORS por defecto
                .and().csrf().disable().authorizeRequests().mvcMatchers( apiPath + "/public/**" ).permitAll()
        .mvcMatchers( apiPath + "/**" ).hasAnyAuthority( serverScopes ).anyRequest().authenticated().and()
        .addFilterAfter( loggingFilterBean(), BearerTokenAuthenticationFilter.class )
        .oauth2ResourceServer().jwt();
    }
}


############### En versiones de Spring-Boot 2.7.X
public class SecurityConfig {
 
    @Value( "${server.scopes}" )
    private String[] serverScopes;
 
    @Value( "${app.server.path}" )
    private String apiPath;
 
    @Bean
    public FundeWebJSLoggingAuthorizationFilter loggingFilterBean() {
       return new FundeWebJSLoggingAuthorizationFilter();
    }
 
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.requestMatchers().antMatchers( "/public/**" ).and().requestMatchers().antMatchers( apiPath + "/**" ).and()
        .sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS )
        // configuro politica de sesion sin estado
        .and().cors() // Aniado configuracion CORS por defecto
                .and().csrf().disable().authorizeRequests().mvcMatchers( apiPath + "/public/**" ).permitAll()
        .mvcMatchers( apiPath + "/**" ).hasAnyAuthority( serverScopes ).anyRequest().authenticated().and()
        .addFilterAfter( loggingFilterBean(), BearerTokenAuthenticationFilter.class )
        .oauth2ResourceServer().jwt();
 
        return http.build();
    }
}


a. Hay que eliminar dicha clase SecurityConfig.


Info

La configuración de seguridad estándar se realizará, a partir de ahora, en la clase FundeWebJSSecurityConfig incluida en la librería fundewebjs-spring-boot-starter.
Si la configuración actual es diferente por que se validan otros paths, otros claims, se ha configurado el loa, se ha modificado el tratamiento de excepciones, etc., se recomienda mantener el archivo SecurityConfig y establecer en el application.properties (de local y del repo de Helm Chart), la property: fdwjs.starter.security.enable=false.


(advertencia) Este es un punto importante. Ante cualquier duda ponga Jira como se indica al final de esta página. (advertencia)


...

5. application.properties local

En el fichero application.properties local hay que añadir, si no estaban ya incluidas, las propiedades:

Bloque de código
fdwjs.api.lagar.enable=true
fdwjs.api.lagar.headers=UMU-User-UUID,UMU-Client-APP


...

6. ForwardedHeaderFilter

Si la aplicación tiene un @Bean ForwardedHeaderFilter declarado, eliminarlo.


...

7. Pruebas

Una vez realizados todos los cambios, hay que comprobar:

- que la aplicación despliega en local correctamente
- que los tests se siguen pasando con normalidad
- probar que los endpoints siguen funcionando, con el foco en la correcta securización con los tokens oauth.
- mergear a desarrollo y comprobar que la imagen nueva ha desplegado y que todo funciona correctamente.

...

Cambios Spring-Boot 2.7





...

Dudas y soporte

Si se tiene alguna duda o problema siguiendo esta página, poner Jira a:

  • Proyecto: DJ-AT-MNCS
  • Responsable: Sin asignar.
  • Título: Soporte migración a parent FundeWebJS
  • Texto: Descripción del problema/duda


...

Referencias

...