Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

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