validation 사용자 정의 주석 실현

더 읽 기
자바 인 터 페 이 스 는 입 참 을 사용 할 때 일부 매개 변수의 검사 규칙 을 판단 합 니 다.vaidation 의 태그 로 판단 하면 요구 에 부합 되 지 않 는 대부분의 매개 변 수 를 차단 할 수 있 습 니 다.예 를 들 어 notnull max min...일부 업무 수요 에 대한 판단 도 사용자 정의 탭 을 통 해 다음 과 같은 request 입 참 을 실현 할 수 있 습 니 다.여러 매개 변 수 를 판단 하려 면 빈 pom 에 의존 하지 않 는 가방 이 있어 야 합 니 다.
                
			javax.validation
			validation-api
			1.1.0.Final
		
		
			org.hibernate
			hibernate-validator
			5.0.2.Final
		

		
			commons-lang
			commons-lang
			2.6
		

 사용자 정의 탭 구현:
package com.use;

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 java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;

import org.apache.commons.lang.StringUtils;
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl;

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = SimultaneousNotNull.BindChecker.class)
@Documented
public @interface SimultaneousNotNull {
  //              
  int checkCount();

  String message() default "        !";

  Class>[] groups() default {};

  Class extends Payload>[] payload() default {};


  public static class BindChecker implements ConstraintValidator {

    private static final ReentrantLock LOCK = new ReentrantLock();
    
    //       SimultaneousNotNull    ,   checkCount            
    private static AtomicInteger atomicInteger = new AtomicInteger(0);
    
    //     SimultaneousNotNull         ,        true,     
    private static AtomicBoolean atomicBoolean = new AtomicBoolean(false);

    /**
     * @see javax.validation.ConstraintValidator#initialize(java.lang.annotation.Annotation)
     */
    public void initialize(SimultaneousNotNull constraintAnnotation) {}

    /**
     * @see javax.validation.ConstraintValidator#isValid(java.lang.Object,
     *      javax.validation.ConstraintValidatorContext)
     */
    public boolean isValid(String strValue, ConstraintValidatorContext context) {
      atomicInteger.getAndIncrement();
      Map attributes =
          ((ConstraintValidatorContextImpl) context).getConstraintDescriptor().getAttributes();
      String type = (String) attributes.get("type");
      String message = (String) attributes.get("message");
      int checkCount = Integer.parseInt(attributes.get("checkCount").toString());
      
      //    
      LOCK.lock();
      try {
        if (StringUtils.isNotBlank(strValue)) {
          atomicBoolean.set(true);
        }
        //last one
        if (atomicInteger.get() == checkCount && !atomicBoolean.get()) {
          return false;
        }
        return true;
      } finally {
        if (atomicInteger.get() == checkCount) {
          atomicBoolean.set(false);
          atomicInteger.set(0);
        }
        //    
        LOCK.unlock();
      }
    }


  }

}

 
request 검 증 된 실체
package com.use;

import javax.validation.constraints.NotNull;

public class BindCase{

  @SimultaneousNotNull(checkCount = 2)
  private String customer;
  
  @SimultaneousNotNull(checkCount = 2)
  private String id;
  
  @NotNull
  private String name;

  public String getCustomer() {
    return customer;
  }

  public void setCustomer(String customer) {
    this.customer = customer;
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  
  
}

 
main 방법
package com.use;

import java.util.Iterator;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.groups.Default;
public class Main {
  
  public static void main(String[] args) {
    BindCase case1 = new BindCase();
//    case1.setCustomer("1");

  Set> constraintViolations =
      Validation.buildDefaultValidatorFactory().getValidator().validate(case1, Default.class);
  if (!constraintViolations.isEmpty()) {
      Iterator> it = constraintViolations.iterator();
      StringBuilder sb = new StringBuilder();
      String msg;
      while (it.hasNext()) {
          sb.append(it.next().getMessage());
          sb.append(",");
      }
      msg = sb.substring(0, sb.lastIndexOf(",")).toString();
      System.err.println(msg);
      System.err.println("    ");
  }
  }
  

}

 
이상 의 업무 논리 실현 은 주로 javax.vaidation.constraintValidatorContext 인 터 페 이 스 를 실현 하 였 습 니 다.
다른 요구 사항 이 있 으 면 사용자 정의 검사 탭 을 참고 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기