validation 사용자 정의 주석 실현
6446 단어 사용자 정의 주석
자바 인 터 페 이 스 는 입 참 을 사용 할 때 일부 매개 변수의 검사 규칙 을 판단 합 니 다.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 인 터 페 이 스 를 실현 하 였 습 니 다.
다른 요구 사항 이 있 으 면 사용자 정의 검사 탭 을 참고 할 수 있 습 니 다.