Spring MVC Bean Validation es una de las características más utilizadas de Spring MVC y nos permite apoyarnos en la JSR 303 (Bean Validation ) para validar la información de los objetos que estemos introduciendo con un formulario. Para ello deberemos incluir en el proyecto de Maven las dependencias de Spring MVC así como las de Hibernate Validator que implementa la especificación JSR 303.
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.7.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.3.Final</version> </dependency> </dependencies>
El siguiente paso será configurar Spring para que el fichero de Application-Context.xml soporte anotaciones a nivel de controladores.
<?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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <mvc:annotation-driven /> <context:component-scan base-package="com.arquitecturajava.controller" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
Realizadas estas dos primeras operaciones construiremos un formulario que nos permite introducir el nombre y la edad de una Persona.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <form:form modelAttribute="persona" action="verPersona.do" method="post"> Nombre:<form:input id="nombre" path="nombre" /> Edad:<form:input id="edad" path="edad" /> <form:button value="enviar" >enviar</form:button> <form:errors path="edad" /> </form:form> </body> </html>
Spring MVC Bean Validation (Business Object)
Realizados estos primeros pasos debemos implementar en la clase de negocio “Persona” las anotaciones de Bean Validation que permitan validar el campo edad.
package com.arquitecturajava.negocio; import javax.validation.constraints.Min; import javax.validation.constraints.Size; public class Persona { private String nombre; @Min(0) private int edad; public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } }
Como se puede observar se ha utilizado la anotación @Min para asegurar que el valor mínimo del campo edad es cero.
Spring MVC Bean Validation (Controller)
Por último queda ver como se implementa el Controlador.
package com.arquitecturajava.controller; import javax.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import com.arquitecturajava.negocio.Persona; @Controller public class PersonaController { @RequestMapping(value ="/verPersona") public String enviar(@Valid Persona persona, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "formularioPersona"; }else { return "verPersona"; } } @RequestMapping(value="/formularioPersona") public String formularioPersona(@ModelAttribute Persona persona) { return "formularioPersona"; } }
En este caso el método enviar incluye una anotación @Valid que se encarga de comprobar si las validaciones de la clase Persona se cumplen o no. En el caso de que se cumplan pasamos a una página de destino que muestra los datos de la Persona. En caso contrario retornamos el control a la página original si la edad es negativa.
Con estos datos Spring MVC creará un objeto de tipo Persona y le pasará la información del formulario. Las anotaciones de Bean Validation comprobarán si el objeto es válido.
Al no serlo nos enviará de vuelta al formulario mostrándonos un mensaje de error que clarifique lo que ha sucedido.
De esta forma habremos integrado Bean Validation con Spring MVC. Una de las grandes ventajas de Bean Validation es que únicamente implementamos las validaciones en un lugar.
Otros artículos relacionados :
Hola Cecilio,
Soy Alex de Brasil y tengo una duda con relación a Validación de dos o más Objectos, cómo hacerlo?
Ejemplo:
@RequestMapping(method=RequestMethod.POST)
public ModelAndView save(@Validated PersonaFisica personaFisica, @Validated Direccion direccion, Errors errors) {
ModelAndView mv = new ModelAndView(“CadastroPessoaFisica”);
if (errors.hasErrors()) {
return mv;
}
return mv;
}
Este ejemplo. no me deja hacerla, dame un errorr em mi formulario.
Está correcto la validación o no hay cómo validar dos objectos?
La anotación standard es @Valid @Validated es una extensión de Spring para casos mas complejos puede ser ese el error?
Si lo que quiero hacer es un Valid de un objeto en funcion de que este vacio otro objeto?
Creo que necesitarías crear tu propio validador https://stackoverflow.com/questions/2781771/how-can-i-validate-two-or-more-fields-in-combination
Me parece muy bien, pero ami no me gusta usar etiqueta de spring en html, me gusta las etiqueta HTML nativas, como podria hacer esto
[…] Otros artículos relacionados: Introducción a Spring MVC ,Spring MVC Bean Validation […]
Bastante bueno el artículo. Un detalle interesante que descubrí es que, si queremos usar validación para beans que están adentro del bean principal, también es posible hacerlo. Tomando tu ejemplo del bean Persona, si dentro tuviese una propiedad que es un objeto también como este: public class TarjetaCredito { private String codigo; private Double monto; … } Y dentro de Persona.java @Valid private TarjetaCredito tarjeta; Con la anotación @Valid sobre nuestra propiedad que es un objeto con propiedades dentro de si, podremos validarlas, en este caso, podremos usar anotaciones en codigo y monto que están dentro de TarjetaCredito, que a… Read more »
Nombre:<form:input id=”nombre” path=”nombre” />
Nombre:<form:input id=”codigo” path=”tarjeta.codigo” />
Me hice un lío con los símbolos menor que y mayor que.
A veces html en wordpress es un lio 🙁
Gracias por el aporte 🙂