Tabla de Contenidos

Validación de Servicios REST

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 Bean Validation 1.0 e 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:

    <bean id="validationExceptionMapper" class="org.umu.atica.jaxrs.validation.exceptions.ValidationExceptionMapper"/>
    <bean id="validationProvider" class="org.umu.atica.jaxrs.validation.FundeWebBeanValidationProvider"/>
    <bean id="fundeWebIntegrationInvoker" class="org.umu.atica.jaxrs.FundeWebIntegrationInvoker">
        <property name="provider" ref="validationProvider" />
    </bean>
    <jaxrs:server id="servicioRest" address="/rest">
        <jaxrs:serviceBeans>
            <ref bean="serviceBean" /> <!-- Un servicio Rest -->
        </jaxrs:serviceBeans>
        <jaxrs:providers>
            <ref bean="validationExceptionMapper"/>
        </jaxrs:providers>
        <jaxrs:invoker>
            <ref bean="fundeWebIntegrationInvoker" />
        </jaxrs:invoker>
    </jaxrs:server>

Bibliografía y Referencias

Bean Validation

Hibernate Validator

The Java EE 6 Tutorial

Bean Validation & Rest