How to create a custom bean validation in JavaEE
Bean validation has been mentioned on many articles online but I found few that explain the actual class that implements the constraint vali...
https://www.czetsuyatech.com/2013/06/javaee-custom-bean-validation.html
Bean validation has been mentioned on many articles online but I found few that explain the actual class that implements the constraint validator. For example: the bean validation article from  oracle javaee6 documentation: http://docs.oracle.com/javaee/6/tutorial/doc/gkfgx.html.
If you try to annotated your bean field with @Email, nothing will happen :-)
I'll just write the most important part of the code, so I assume you already have a javaee6 web project created. I suggest you do that by using jboss javaee6 archetype.
For example we want a custom email validator, we will need at least 4 classes: bean, entity, @interface and the validator implementation. So let's start with the entity class, let's say we have a User:
Note that you can initialize field in initialize() method, so later you can use these fields in isValid().
And that's it we now have a custom email validator. Just a reminder, in some of the class like the ones defined in hibernate you will notice that the interface contains: @Constraint(validatedBy = { }), just remove these property. This property specify which validator to use, without value it will not validate. Or you can specify the validator with this property: @Constraint(validatedBy = { EmailValidator.class })
If you try to annotated your bean field with @Email, nothing will happen :-)
I'll just write the most important part of the code, so I assume you already have a javaee6 web project created. I suggest you do that by using jboss javaee6 archetype.
For example we want a custom email validator, we will need at least 4 classes: bean, entity, @interface and the validator implementation. So let's start with the entity class, let's say we have a User:
@Entity
@Table
public class User implements Serializeable {
 @Email
 private String email;
}
As you can see, we annotated the email field with @Email annotation. After that let's define the Email 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.Constraint;
import javax.validation.Payload;
@Documented
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE,
  ElementType.CONSTRUCTOR, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface Email {
 String message() default "message.validation.invalidEmail";
 Class[] groups() default {};
 Class[] payload() default {};
 String regexp() default "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)";
}
This object contains the variables needed by a ConstraintValidator such as message, group, etc. And finally the implementation class:
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class EmailValidator implements ConstraintValidator<Email, String> {
 @Override
 public void initialize(Email constraintAnnotation) {
 }
 @Override
 public boolean isValid(String value, ConstraintValidatorContext context) {
  try {
   new InternetAddress(value).validate();
  } catch (AddressException e) {
   return false;
  }
  return true;
 }
}
This class validates if a given value is email using the InternetAddress class. The EmailValidator implements ConstraintValidator with type parameters <interface, value>.Note that you can initialize field in initialize() method, so later you can use these fields in isValid().
And that's it we now have a custom email validator. Just a reminder, in some of the class like the ones defined in hibernate you will notice that the interface contains: @Constraint(validatedBy = { }), just remove these property. This property specify which validator to use, without value it will not validate. Or you can specify the validator with this property: @Constraint(validatedBy = { EmailValidator.class })

 



 
 
 
Post a Comment