====== Validación de Servicios REST ====== --- //[[juanmiguelbg@um.es|JUAN MIGUEL BERNAL GONZALEZ]] 2015/11/19 08:54 - extensión: 8753// Hemos añadido la posibilidad de hacer la validación de los métodos ó recursos expuestos en los servicios //REST//. Para esta validación podéis utilizar los validadores de [[http://beanvalidation.org/1.0/spec/|Bean Validation 1.0]] e [[http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/|Hibernate Validation 4.3.2.Final]], además de los que os hayáis definido vosotros con estas tecnologías. ===== Ejemplos ===== Veamos un par de ejemplos: package es.um.atica.portalfundeweb.rest; import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import org.hibernate.validator.constraints.Length; @Path("pruebaRest") public class PruebaRest { @GET @Path("/saluda") @Length(min=5) public String saluda(@NotNull @Length(min=2, max=10) @QueryParam("nombre") String nombre) { return "Hola " + nombre + "!!!" ; } @GET @Path("/validaPersona") @Valid public PersonaPrueba validaPersonaPrueba( @NotNull @Length(min = 2, max = 10 ) @QueryParam( "nombre" ) String nombre, @NotNull @Length(min = 2, max = 10 ) @QueryParam( "apellido" ) String apellido, @NotNull @Length(min = 2, max = 10 ) @QueryParam( "movil" ) String movil ) { return new PersonaPrueba(nombre, apellido, movil); } } En el servicio //REST// //PruebaRest// tenemos dos métodos //saluda// y //validaPersonaPrueba//, estos métodos tienen anotaciones de validación, tanto para los parámetros de entrada como para el resultado de la operación. Para el método //saluda//, el parámetro de entrada //nombre// no puede ser nulo y tiene que tener una longitud entre 2 y carácteres. El resultado del método tiene que tener una longitud mínima de 5 carácteres. Para el método //validaPersonaPrueba//, los parámetros de entrada no puede ser nulos y tienen que tener una longitud entre 2 y carácteres. El resultado del método es una instancia de la clase //PersonaPrueba//. Para validar un tipo complejo, se utiliza la anotación //javax.validation.@Valid//. package es.um.atica.portalfundeweb.rest; import javax.validation.constraints.NotNull; import org.hibernate.validator.constraints.Length; public class PersonaPrueba { public PersonaPrueba(String nombre, String apellido, String movil) { this.nombre = nombre; this.apellido = apellido; this.movil = movil; } @NotNull @Length(min=5, max=10) private String nombre; @NotNull @Length(min=5, max=10) private String apellido; @NotNull @Length(min=5, max=10) private String movil; public String getNombre() { return nombre; } public void setNombre( String nombre ) { this.nombre = nombre; } public String getApellido() { return apellido; } public void setApellido( String apellido ) { this.apellido = apellido; } public String getMovil() { return movil; } public void setMovil( String movil ) { this.movil = movil; } @Override public String toString() { return nombre + " " + apellido + " --> " + movil; } } La anotación //javax.validation.@Valid// indica al sistema de validación, que valide las propiedades de la clase //PersonaPrueba//. Esta clase tiene tres propiedades que no pueden ser nulas y tienen que tener una longitud comprendida entre 5 y 10 carácteres. ===== Comportamiento ante Errores de Validación ===== Cuando se produce un error de validación, se responde de la siguiente manera: - Cuando se produce un error de validación en la respuesta, se devuelve un estado HTTP 500 (Internal Server Error), junto con la información de los errores de validación, que también nos aparecerán en el sistema de //log// de la aplicación. - Para el resto de errores de validación, se devuelve un estado HTTP 400 (Bad Request), junto con la información de los errores de validación, que también nos aparecerán en el sistema de //log// de la aplicación. ===== Configuración ===== Para aplicaciones FundeWeb 2.0 no es necesaria ninguna configuración. Para aplicaciones Fundeweb 1.5 migradas a Weblogic 12.2, tenemos que editar el fichero //cxf-beans.xml// añadiendo la siguiente configuración: ---- ===== Bibliografía y Referencias ===== === Bean Validation === * [[http://beanvalidation.org/1.0/spec/|JSR 303: Bean Validation 1.0 - Specification]] * [[http://beanvalidation.org|Bean Validation Official Site]] === Hibernate Validator === * Hibernate Validator 4.3 - [[http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/|Documentation]] - [[http://docs.jboss.org/hibernate/validator/4.3/api/|API]] * [[http://antoniogoncalves.org/2010/03/03/bean-validation-with-jpa-1-0/|Bean Validation with JPA 1.0]] === The Java EE 6 Tutorial === * The Java EE 6 Tutorial - [[http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html|Using Bean Validation]] - [[http://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html#gkahq|Validating Persistent Fields and Properties]] - [[http://docs.oracle.com/javaee/6/tutorial/doc/gkahp.html|Bean Validation: Advanced Topics]] === Bean Validation & Rest === * [[https://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced002.htm|The Java EE Tutorial - Validating Resource Data with Bean Validation]] * [[http://securesoftwaredev.com/2013/08/19/how-to-implement-input-validation-for-rest-resources/|How To Implement Input Validation For REST resources]] * [[https://jaxenter.com/integrating-bean-validation-with-jax-rs-2-106887.html|Integrating Bean Validation with JAX-RS]]