miércoles, 13 de octubre de 2010

Como usar Spring Validator en ColdFusion

Para usar esto debes haber configurado primero el javaloader 1.0 http://www.compoundtheory.com/javaloader/docs/ de tu aplicacion de coldfusion.

Para validar primero necesitamos un bean del modelo, usaremos para el ejemplo la clase Contact.java.

import javax.persistence.*;


import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name="Contacts")
public class Contact {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "contact_id")
private Long id;

@Size(max=50)
@Column(name="contact_name")
private String name;

@Size(max=100)
@Column(name="contact_email")
private String email;

public Contact(){
this.name = "";
this.email = "";
}

//getters and setters ...
}




Spring Framework nos da una interfaz de validacion fácil de usar y libre de contexto, asi que creamos un ContactValidator. Esta interfaz tiene dos métodos, support(Class) y validate(Oject, Errors). La referencia Object indica el contacto que vamos a validar, y Errors es una interfaz de springframework que guarda los errores si estos ocurren. Esto se explica mejor en el capitulo 5 de la referencia de Spring Framework.



ContactValidator.java





package com.admios.utils;

import org.springframework.validation.*;

import com.admios.model.Contact;


public class ContactValidator implements Validator {

private static String emailRegularExpression = "[a-zA-Z_]+.+@.+\\..+";

@Override
public boolean supports(Class<?> clazz) {
return Contact.class.equals(clazz);
}

@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "name", "You must provide a name for this contact.");

Contact cont = (Contact) target;
if (! cont.getEmail().matches(emailRegularExpression)){
errors.rejectValue("email", "Please provide a valid email address in the format user@domain.com (Display Name)");
}
}

public static String getEmailRegularExpression() {
return emailRegularExpression;
}
}




Ok, Vamos a usar el camino mas facil para hacer el llamado en ColdFusion, solo queremos enviar el contacto al servicio y recoger los errores, sin tener que lidiar con el metodo de validacion directamente.



En Util.java creamos un metodo estatico para validar el contacto y que nos traiga de vuelta los errores. BindException es una implementación de Errors.





package com.admios.utils;


import org.springframework.validation.BindException;
import org.springframework.validation.Errors;

import com.admios.model.Contact;

public class Util {

public static Errors validateContact(Contact contact){

ContactValidator validator = new ContactValidator();
Errors errors = new BindException(contact, "contact");
validator.validate(contact, errors);
return errors;
}
}




Una vez hecho esto, y haber sido probado con JUnit, podemos mover el servicio a la aplicacion de coldFusion.



check_contact.cfm





 <cfset lstLocalErrors = "">
<cfparam name="is_active" default="0">


<!-----------------------------------------------------------------------------
! Binding And Validation
!----------------------------------------------------------------------------->

<cfscript>
contact = server.javaloader.create("com.admios.model.Contact").init();
utilClass = server.javaloader.create("com.admios.utils.Util").init();

contact.setName(con_name);
contact.setEmail(con_email);

errors = utilClass.validateContact(contact);

</cfscript>

<cfif errors.getErrorCount() eq 0>

<!--------------------------------------------------------------------------
! Save, if no occurs errors.
!------------------------------------------------------------------------->


<cfinclude template="/includes/user/event/save_contact.cfm">
<cfelse>
<cfset lstErrorFields = "">
<cfscript>
errorName = errors.getFieldError("name");
errorEmail = errors.getFieldError("email");
</cfscript>

<!-------------------------------------------------------------------------
! error messages
!------------------------------------------------------------------------->

<cfif isDefined("errorName")>
<cfset lstLocalErrors = ListAppend(lstLocalErrors, errorName.getCode(),CHR(9))>
<cfset lstErrorFields = ListAppend(lstErrorFields, 'con_name')>
</cfif>

<cfif isDEfined("errorEmail")>

<cfset lstLocalErrors = ListAppend(lstLocalErrors, errorEmail.getCode(), CHR(9))>
<cfset lstErrorFields = ListAppend(lstErrorFields, 'con_email')>
</cfif>
<cfset lstErrors = ListAppend(lstErrors, lstLocalErrors, CHR(9))>
</cfif>




    Con errors.getFieldError("name") obtenemos el campo de error que validamos en ContactValidator.java





ValidationUtils.rejectIfEmpty(errors, "name", "You must provide a name for this contact.");




    Y lo mismo para el email.



El errorEmail.getCode() nos da el codigo para al propiedad a ser mostrada en la vista del usuario. Si el codigo no es encontrado en el archivo de properties, entonces el mismo "codigo" es devuelto.



Reference:



BindException



Errors



ValidationUtils



Validator



spring-framework-reference.pdf


No hay comentarios:

Publicar un comentario