In order to create a custom constraint for a bean validator, first you should declare an interface and decorate it with the following annotations:
@Target = what it works on
@Retention = must be runtime in order to work on runtime
@Constraint = the custom validator (if you have created one)
@Documented = if provided will document the constraint on the java docs.
In the example below there is a custom validator for a URL address that returns error when the protocol or the host are not correct or well formed.
@Target({ METHOD, ANNOTATION_TYPE ,FIELD, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Constraint(validatedBy = {URLValidation.class}) @Documented public @interface URL{ String message() default "malformed URL"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; String protocol() default=""; }
Then Create the custom Validation noted in the @Constraint annotation:
public class URLValidator implement ConstraintValidator<Url,String> { String protocol; @Override public void initialize(URL url){ this.protocol = url.protocol(); } @Override public boolean isValid(String object, ConstraintValidatorContext cons traintContext) { java.net.URL url; try { url = new java.net.URL(object) } catch(MalformedUrlException e){ return false;} if ( protocol != null && protocol.length()>0 && !url.getProtocol().equals(protocol)) {return false;} return true; }
Create any class (it doesn’t have to be a bean class although my example is) and annotate it with the URL custom validation on a field
package beans; imoprt java.io.* public class ServerConnection implements Serializable { @URL(protocol="https") private String baseURL; public ServerConnection() {} public ServerConnection (String baseUrl) { this.baseURL = baseURL; } public getBaseURL { return this.baseUrl; } }
Now to see how it works just create Validation Factory and a connection in the class Main or where ever you use it:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
javax.validation.Validator validator = factory.getValidator();
Set<ConstraintViolation<ServerConnection>> violation;
ServerConnection connection = new ServerConnection("https://www.google.com");
violations =validator.validate(connection);
if(violations.size()>0){
// do failback logic
}