Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
E-mail валидатор и не только для Oval
Постоянная ссылка 01-02-2008 anydoby java

Недавно нашел изумительный фреймворк для валидации 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>

Приятного пользования...

Добавить комментарий

Предыдущая статья Weaving аспектов при помощи Maven2 (часть 2) Следующая статья Улучшенный Spring валидатор для Oval