Spring
Introducción
La idea principal en el desarrollo del framework Spring es simplificar el trabajo del desarrollador.
Se ha convertido en un estándar de facto para construir aplicaciones Java empresariales.
Spring Boot es un componente del framework Spring que permite comenzar el desarrollo de una aplicación en minutos. Se basa en
Convención sobre configuración (CoC).
Módulos
Características principales
Inyección de dependencias
En el corazón del framework Spring se encuentra la inyección de dependencias (DI).
Programación orientada a aspectos
AOP es un modelo de programación que implementa la lógica cruzada.
Registro de logs, transacciones, métricas y seguridad son algunos requisitos transversales a toda la aplicación.
Spring Boot
Spring Boot tiene como objetivo simplificar el arranque de Spring proporcionando un conjunto de plantillas iniciales, que resuelven las dependencias necesarias según el tipo de proyecto.
También proporciona una configuración inicial que simplifica enormemente el desarrollo de aplicaciones.
Puede utilizar tanto Maven como Gradle.
Se puede crear un nuevo proyecto Spring Boot con Spring Initializr
Módulos de inicio de Spring Boot
spring-boot-starter
. Dependencias principales del núcleo.spring-boot-starter-aop
. Programación orientada a aspectosspring-boot-starter-test
. Dependencias para pruebas como JUnit, Mockito yspring-test
.spring-boot-starter-web
. Dependencias MVC.spring-boot-starter-data-jpa
. Soporte de JPA mediantespring-data-jpa
,spring-orm
y dependencias Hipernate.spring-boot-starter-data-rest
.spring-data-rest-webmvc
para exponer repositorios como REST API.spring-boot-starter-hateoas
. Dependenciasspring-hateoas
para servicios HATEOAS REST.spring-boot-starter-jdbc
. Bases de datos JDBC.spring-boot-maven-plugin
. Empaquetado de aplicaciones en ejecutables JAR/WAR .
Spring REST
Para desarrollar servicios Rest con Spring se utiliza el módulo Spring Web, también junto a este módulo se suelen usar Spring Data, Spring Security y Spring Boot.
Spring REST Controller no está pensado para interpretar páginas web, sino para enviar y recibir datos, diseñando RESTful APIs.
Se puede utilizar un framework Javascript, como Angular, para invocar a la aplicación llamando a los endpoints del API REST y así consumir datos.
💡 Consejo de buen diseño
En las urls de los endpoints no se deberían tener verbos, solo nombres.
Siempre hay que usar minúsculas. Nunca usar guiones bajos para separar palabras, usar guiones normales.
Accediendo a aplicaciones REST
Aplicaciones para probar REST
- Advanced REST client
- Postman. Se puede instalar como aplicación propia, o como extensión de Chrome.
Spring Web MVC
Está basado en la arquitectura MVC . Aporta un conjunto de anotaciones y componentes.
La implementación MVC de Spring gira en torno al DispatcherServlet
, una implementación del patrón FrontController
, que actúa como punto de entrada para gestionar las peticiones.
Componentes Spring Web MVC
Controlador
Los controladores en Spring Web MVC se declaran usando el estereotipo org.springframework.stereotype.Controller
. Un estereotipo en Spring designa roles o responsabilidades de una clase o interfaz.
Ejemplo:
@Controller
public class HomeController {
@getMapping("/home.html")
public String showHomePage() {
return "home";
}
}
Modelo
Spring proporciona la interfaz org.springframework.ui.Model
que sirve como soporte para los atributos del modelo.
Ejemplo:
@getMapping("/home/html")
public String showHomePage(Model model) {
model.addAttribute("currentDate", new Date());
return "home";
}
Vista
Spring Web MVC es compatible con varias tecnologías de vistas como JSP, Velocity, FreeMarker y XSLT. Utiliza la interfaz org.springframework.web.servlet.View
para conseguirlo.
Ejemplo:
@Controller
public class HomeController {
@RequestMapping("/home.html")
public View showHomePage() {
JsltlView view = new JstlView();
view.setUrl("/WEB-INF/pages/home.jsp")
return view;
}
}
Seguridad
Spring Security (Acegi Security) es un framework para securizar aplicaciones Java. Provee integración con variedad de sistemas de autenticación, como LDAP, Kerberos, OpenID, OAuth, etc.
Por defecto habilita protección CSRF . Para servicios utilizados por clientes no navegadores se puede deshabilitar.
Recetas
Despliegue
Para generar un war hay que añadir en el pom.xml
:
<packaging>war</packaging>
También hay que comprobar que esté la dependencia de tomcat:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
y para que no añada la versión en el nombre de la aplicación:
<build>
<finalName>${artifactId}</finalName>
[...]
Se añade la clase ServletInitalizer
(si se elige al crear el proyecto que genere war la crea):
package net.rhernando.gp;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(GestorProyectosApplication.class);
}
}
Por último para desplegarlo en un servidor con más aplicaciones es necesario indicar el context-path en el fichero application.properties
mediante la variable server.servlet.context-path
Y después hacer Run as > Maven install
.
Errores
Problema con maven
El pom.xml
está marcado como erróneo y da el siguiente error al ejecutar un maven clean
o maven install
:
Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources) on project gestorProyectos: Input length = 1 -> [Help 1]
Este error se produce porque maven no es capaz de conectarse a los repositorios de Spring. Para resolver este problema hay que configurar en $HOME/.m2/settings.xml
lo siguiente:
- La conexión a todos los repositorios tiene que ser por https (ahora maven no acepta las conexiones no seguras):
<url>https://repo1.maven.org/maven2</url>
- Hay que añadir la conexión a los servidores de Spring:
<repository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </repository> [...] </pluginRepository> <pluginRepository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </pluginRepository>
(Si no se añaden en el
settins.xml
se pueden añadir en el propiopom.xml
del proyecto). - El proxy tiene que estar configurado correctamente:
<proxy> <id>jcyl</id> <active>true</active> <protocol>http</protocol> <username>hervelro</username> <host>proxy.jcyl.es</host> <port>80</port> <nonProxyHosts>http://despliegues.ae.jcyl.es/artifactory/jcyl-repos</nonProxyHosts> </proxy>
- Es muy importante añadir la etiqueta
<password>
con la contraseña del directorio activo, sino las conexiones a los repositorios irán muy lentas y en algunos casos darán timeout. - Añadir al pom.xml:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.1.0</version> </plugin>
Referencias
- Udemy - Learn Spring 5, Imtiaz Ahmad. Udemy
- Balaji Varanasi Sudha Belida - Spring REST
- https://spring.io/
- https://www.youtube.com/watch?v=O_YFYYCQyZ8&ab
- https://youtu.be/6tWtNYsqXL4?si=ud1v9tnJFo_KcG0j&t=503