domenica 2 dicembre 2012

JSF 2.0 bean validation con Tomcat

Con il meccanismo di tipo bean validation è possibile, senza specificare per ogni campo la tipologia di validazione necessaria, magari richiamando un metodo del managed bean ogni volta, definire una tipologia generica di validazione a livello di managed bean con una annotazione customizzata, in modo che i metodi di validazione siano richiamati ogni volta che si effettua la validazione del managed bean.
Poichè Tomcat non ha nelle sue librerie quelle del package javax.validation.* occorre per prima cosa scaricare i jar corretti e metterli nella lib del progetto Web.
Ho scaricato l'implementazione hibernate validator 4.3.1 dal sito.
Attenzione, non basta scaricare soltanto la libreria della jsr validation-api-1.0.0.jar, questa infatti è solo un'interfaccia, e peraltro per qualche strano motivo che non ho capito se si inserisce nel classpath soltanto la libreria della JSR non si incappa in nessun errore, ma semplicemente i validatori posti come annotation a livello di managed bean sono ignorati.
Le librerie nella lib del progetto sono quindi le seguenti:
  • hibernate-validator-4.3.1.Final.jar;
  • hibernate-validator-annotation-processor-4.3.1.Final.jar;
  • jboss-logging-3.1.0.CR2.jar;
  • validation-api-1.0.0.GA.jar.
Oltre all'implementazione di JSF 2.0 (ho usato Mojarra):

  • javax.faces-2.1.14.jar;
  • jstl-1.2.jar.

Ho inserito il seguente validatore per il campo tipo mail:



package com.jsfcompref.annotation;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class EmailConstraintValidator implements ConstraintValidator {
 private static final String EMAIL_PATTERN = 
  "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
  + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
 @Override
 public void initialize(Email parameters) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public boolean isValid(String value, ConstraintValidatorContext arg1) {
  Pattern pattern = Pattern.compile(EMAIL_PATTERN);
  Matcher matcher=pattern.matcher(value);
  return matcher.matches();
 }

}
L'annotation chiamata Email è così definita:

package com.jsfcompref.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.*;
import javax.validation.Constraint;
@Documented
@Constraint(validatedBy=EmailConstraintValidator.class)
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Email {
String message() default "{validator.email})";
Class[] groups() default{};
Class[] payload() default{};
}


Quindi basta annotare il managed bean in questo modo:

.....

@Email(message="Attenzione email non valida")
 private String email;
// getter e setter
E poi sulla facelet definire semplicemente il campo mail così:

<h:inputText label="Email" id="email" value="#{userBean.email}" required="true"/>


Nel caso di errori nel campo mail comparirà quindi il messaggio specificato nell'annotation (di default cerca il messaggio nel file di properties).

Nessun commento:

Posta un commento