Недавно нашел изумительный фреймворк для валидации Oval. Очень сильная платформа с множеством уже готовых валидаторов, поддержкой Spring, AOP и т.д.
Написание собственных валидаторов тоже не вызвало никаких проблем, так что недостающие фичи можно реализовать самому. Здесь я делюсь несколькими полезными валидаторами, которые я написал для Oval.
Валидация e-mail многим, наверное, уже набила оскомину, и тем не менее, повторюсь еще раз. Обычно используется для этой цели регулярное выражение, коих множество в интернете. Я не стал изобретать велосипед и использовал уже готовое выражение, которое написал один добрый человек. А вот мои пять копеек:
package com.anydoby.oval;
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 net.sf.oval.ConstraintViolation;
import net.sf.oval.configuration.annotation.Constraint;
/**
* This annotation validates e-mails.
*
* @author SergeyZ
*
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Constraint(checkWith = EmailCheck.class)
public @interface Email {
/**
* error code passed to the ConstraintViolation object
*/
String errorCode() default "com.anydoby.oval.Email";
/**
* message to be used for the ContraintsViolatedException
*
* @see ConstraintViolation
*/
String message() default "com.anydoby.oval.Email.violated";
/**
* severity passed to the ConstraintViolation object
*/
int severity() default 0;
/**
* The associated validation profiles.
*/
String[] profiles() default {};
}
И сам валидатор:
package com.anydoby.oval;
import java.util.regex.Pattern;
import net.sf.oval.Validator;
import net.sf.oval.configuration.annotation.AbstractAnnotationCheck;
import net.sf.oval.context.OValContext;
import net.sf.oval.exception.OValException;
/**
* An email address represents the textual string of an <a
* href="http://www.ietf.org/rfc/rfc2822.txt">RFC 2822</a> email address and other corresponding
* information of interest.
*/
public class EmailCheck extends AbstractAnnotationCheck<Email> {
private static final long serialVersionUID = -6119404384353353123L;
// RFC 2822 token definitions for valid email - only used together to form a
// java Pattern object:
private static final String sp = "\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~";
private static final String atext = "[a-zA-Z0-9" + sp + "]";
private static final String atom = atext + "+"; // one or more atext chars
private static final String dotAtom = "\\." + atom;
private static final String localPart = atom + "(" + dotAtom + ")*"; // one
// atom
// followed
// by 0
// or
// more
// dotAtoms.
// RFC 1035 tokens for domain names:
private static final String letter = "[a-zA-Z]";
private static final String letDig = "[a-zA-Z0-9]";
private static final String letDigHyp = "[a-zA-Z0-9-]";
public static final String rfcLabel = letDig + "(" + letDigHyp + "{0,61}" + letDig + ")?";
private static final String domain = rfcLabel + "(\\." + rfcLabel + ")*\\." + letter + "{2,6}";
// Combined together, these form the allowed email regexp allowed by RFC
// 2822:
private static final String addrSpec = "^" + localPart + "@" + domain + "$";
// now compile it:
public static final Pattern VALID_PATTERN = Pattern.compile(addrSpec);
/**
* Utility method that checks to see if the specified string is a valid email address according to
* the RFC 2822 specification.
*
* @param email the email address string to test for validity.
* @return true if the given text valid according to RFC 2822, false otherwise.
*/
public static boolean isValidText(String email) {
return VALID_PATTERN.matcher(email).matches();
}
public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context,
Validator validator) throws OValException {
if (valueToValidate == null) {
return true;
}
return isValidText(valueToValidate.toString());
}
}
Кроме этого, я написал еще @DateRange - валидатор, проверяющий, вмещается ли введенная дата в нужные временные рамки; @Equal - проверяет, равняется ли значение параметра значению другого поля (полезно для валидации, например, подтверждения пароля); @NotEqual - то же самое, что и @Equal, только наоборот :)
Если интересно, можете добавить в ваш maven билд мой репозиторий
<repositories>
<repository>
<id>anydoby.com</id>
<url>http://anydoby.com/maven</url>
</repository>
</repositories>
а в зависимости
<dependency>
<groupId>com.anydoby</groupId>
<artifactId>oval-extensions</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
Приятного пользования...
