martes, 28 de agosto de 2007

Validación usando validation.xml, validator-rules.xml y un validador propio

Problema: Hacer un validador externo para ser usado desde el validation.xml.

Solución:
1.- Hago una clase que tenga mi método de validación

public class MiValidation implements Serializable{

/**
* Valida un dce con el formato de dos dígitos seguidos de una barra y luego 4 dígitos. Ej.: 33/12345
* @return false si no hubo error, true si hubo algún error
*/
public static boolean validateDCE(java.lang.Object bean,
org.apache.commons.validator.ValidatorAction va,
org.apache.commons.validator.Field field, ActionMessages errors,
Validator validator, javax.servlet.http.HttpServletRequest request) {
// reflejamos el metodo en el logger
if (ValidationCortas.logger.isDebugEnabled()) {
ValidationCortas.logger
.debug("ValidationCortas: Método validateDCE");
}

// miramos si el objeto es un string
String value = null;
if (MiValidation.isString(bean)) {
// metemos el string en la variable value
value = ((String) bean);
} else {
// obetenemos el valor del bean
value = ValidatorUtils.getValueAsString(bean, field.getProperty());
}

// comprobamos que tenga algo
if (!GenericValidator.isBlankOrNull(value)) { //esa función es propia es para que no sea null o cadena vacía
String expReg = "^(\\d{2})(/\\d{4})$"; //ej.: 33/12345
boolean mach=value.matches(expReg);
if (value.matches(expReg) ){
return (false);
}else{
errors.add(field.getKey(), Resources.getActionMessage(request, va,
field));
return (true);

}
}
return (false);
}

/**
* Método que determina si el objeto es o no de tipo String
*
* @param Object o, el objeto a analizar
* @return boolean true si es String, false en caso contrario o si es null
*/
private static boolean isString(Object o) {
// si es null, es string
if (o == null) {
return (true);
}
return (String.class.isInstance(o));
}

} //fin de la clase


2.-En el validator-rules hago un validador. El msg lo extraerá del ApplicationResources respectivo. Nota: Quitar los espacios luego del '<'

< validator name="validateDCE"
classname="es.mipaquete.web.validator.MiValidation"
method="validateDCE"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.invalid.dce" >
< /validator>


3.-En el validation.xml, indico que campo del formulario está sometido a la validación. En el ejemplo muestro como colocar para el form. El key que coloco lo
extraerá del ApplicationResources respectivo. Nota: Quitar los espacios luego del '<'


< formset>
< form name="miFormBase">
< field property="maderistaForm.calificacionEmpresarial" depends="validateDCE">
< arg0 key="error.maderista.calificacionEmpresarial" name="validateDCE"/>
< /field>
< /form>
< /formset>


4.-En el ApplicationResources meto las variables necesarias:

errors.invalid.dce=\"{0}\" debe ser un DCE válido, ejemplo: 33/9999.
error.maderista.calificacionEmpresarial = Documento de Calificación Empresarial


5.-Queda colocar en struts que el validate=true y el input en el action correspondiente.

No hay comentarios: