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:
Ho inserito il seguente validatore per il campo tipo mail:
L'annotation chiamata Email è così definita:
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.
- 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();
}
}
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
<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