案例1:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import org.springframework.data.mongodb.core.mapping.Document;
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Document
@Constraint(validatedBy = { Name.NameChecker.class })
public @interface Name {
String message() default "名称不存在";
Class<?>[]groups() default {};
Class<? extends Payload>[]payload() default {};
public static class NameChecker implements ConstraintValidator<Name, String> {
@Override
public void initialize(Name constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if ("111111".equals(value)) {
return true;
}
return false;
}
}
}
public class UserVo {
@NotBlank(message = "[用户名不能为空]")
@Length(max = 64, min = 6, message = "[用户名]长度6~64")
@Name
private String username;
@NotBlank(message = "[密码不能为空]")
@Length(max = 64, min = 6, message = "[密码]长度6~64")
private String password;
@NotNull(message = "[出生日期不能为空]")
private Date birthDate;
}
@RestController
@RequestMapping("/v0.1/users")
public class UserController {
@Autowired
private UserRecordService service;
@RequestMapping(method = RequestMethod.POST)
public UserRecord add(@RequestBody @Valid UserVo vo) {
UserRecord user = new UserRecord();
BeanUtils.copyProperties(vo, user);
return service.add(user);
}
@RequestMapping(method = RequestMethod.GET)
public Items<UserRecord> list(ListParam<UserRecord> listParam){
return service.list(listParam);
}
}
当username取值为"111111"时通过校验,而当是其他值的时候,就会抛出校验异常。
案例2
package com.nd.social.common.validation;
import com.nd.gaea.WafException;
import com.nd.gaea.client.WafResourceAccessException;
import com.nd.social.common.util.UCHelper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.client.ResourceAccessException;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* uid是否属于当前上下文租户
* 注:当被校验对象为空时,校验为通过,所以如果需要校验对象必填,请自行结合相关校验注解
* Created by Zhang JinLong(150429) on 2016-09-18.
*/
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {SameTenant.StringChecker.class, SameTenant.LongChecker.class})
@Documented
public @interface SameTenant {
String message() default "用户不存在或者不属于当前组织";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class StringChecker implements ConstraintValidator<SameTenant, String> {
@Override
public void initialize(SameTenant arg0) {
}
@Override
public boolean isValid(String uid, ConstraintValidatorContext context) {
if (StringUtils.isBlank(uid)) {
return true;
}
try {
return UCHelper.isSameTenant(uid);
} catch (WafResourceAccessException | WafException | ResourceAccessException e) {
return false;
}
}
}
class LongChecker implements ConstraintValidator<SameTenant, Long> {
@Override
public void initialize(SameTenant arg0) {
}
@Override
public boolean isValid(Long uid, ConstraintValidatorContext context) {
if (null == uid) {
return true;
}
try {
return UCHelper.isSameTenant(uid.toString());
} catch (WafResourceAccessException | WafException | ResourceAccessException e) {
return false;
}
}
}
}
3 ConstraintValidator
public interface ConstraintValidator<A extends Annotation, T> {
// 在验证之前调用该方法
void initialize(A constraintAnnotation);
// 验证方法 返回false说明没有通过校验 value的类型T可以有多种类型时,如案例2写多个校验类
boolean isValid(T value, ConstraintValidatorContext context);
}