当前位置:   article > 正文

ConstraintValidator的使用

constraintvalidator

ConstraintValidator是一个工具类,做实体类字段校验

通过注解的方式,对业务代码的整体侵扰比较少

举个例子,有个实体类名字。我只让它输入中文数字字母逗号, 首先加建一个注解

第一步

  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;
  5. import javax.validation.Constraint;
  6. import javax.validation.Payload;
  7. import com.test.utils.validator.IsCNValidator;
  8. @Target({ElementType.FIELD, ElementType.METHOD})
  9. @Retention(RetentionPolicy.RUNTIME)
  10. @Constraint(validatedBy=IsCNValidator.class)
  11. public @interface IsCN {
  12. String message() default"内容输入错误,只允许输入中文或字母和,";
  13. Class<?>[] groups() default {};
  14. Class<? extends Payload>[] payload() default {};
  15. }

第二步

  1. import javax.validation.ConstraintValidator;
  2. import javax.validation.ConstraintValidatorContext;
  3. import com.test.annotation.IsCN;
  4. import java.util.regex.Pattern;
  5. public class IsCNValidator implements ConstraintValidator<IsCN, String>{
  6. String regex = "^[a-z0-9A-Z\u4e00-\u9fa5\uff0c]+$";
  7. private Pattern moneyPattern = Pattern.compile(regex);
  8. @Override
  9. public void initialize(IsCN constraintAnnotation) {
  10. //获取注解上的值,可以做一写取注解上的值做一下判断
  11. }
  12. @Override
  13. public boolean isValid(String value, ConstraintValidatorContext context) {
  14. if (value == null)
  15. //是空的,返回true,是因为如果null,则会有@NotBlank进行提示,如果没有 @NotBlank进行提示则返回false
  16. return true;
  17. return moneyPattern.matcher(value.toString()).matches();
  18. }
  19. }

这两个字段要一样,对应标记字段的类型。如果字段是 List apiList 这样的,则 把String 变成List 

第三步 

  1. //人员
  2. @Length(max=40)
  3. @IsCN(message="工作人员内容输入错误,只允许输入中文或字母和!")
  4. @IsNullOr(message="工作人员内容输入错误,不允许输入null/NULL!")
  5. @NotBlank(message="请填写工作人员!")
  6. private String GZRY;

第四步,手动校验

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.Set;
  4. import javax.validation.ConstraintViolation;
  5. import javax.validation.Validation;
  6. import javax.validation.Validator;
  7. import javax.validation.groups.Default;
  8. /**
  9. * 对新增加的数据做校验
  10. * @author liunn
  11. *
  12. */
  13. public class ValidatorUtil {
  14. private static Validator validator = Validation.buildDefaultValidatorFactory()
  15. .getValidator();
  16. public static <T> Map<String,StringBuffer> validate(T obj){
  17. Map<String,StringBuffer> errorMap = null;
  18. Set<ConstraintViolation<T>> set = validator.validate(obj,Default.class);
  19. if(set != null && set.size() >0 ){
  20. errorMap = new HashMap<String,StringBuffer>();
  21. String property = null;
  22. for(ConstraintViolation<T> cv : set){
  23. //这里循环获取错误信息,可以自定义格式
  24. property = cv.getPropertyPath().toString();
  25. if(errorMap.get(property) != null){
  26. errorMap.get(property).append("," + cv.getMessage());
  27. }else{
  28. StringBuffer sb = new StringBuffer();
  29. sb.append(cv.getMessage());
  30. errorMap.put(property, sb);
  31. }
  32. }
  33. }
  34. return errorMap;
  35. }
  36. }

校验

  1. //获取错误实体类上标记的错误提示,为null代表,字段正常
  2. Map<String, StringBuffer> errorMap =ValidatorUtil.validate(entity);
  3. Map<String, Object> errorMapData = new HashMap<String, Object>();
  4. Map<String, Object> errorMapData1 = new HashMap<String, Object>();
  5. StringBuffer strb = new StringBuffer();
  6. if(errorMap==null) {
  7. //校验通过,
  8. }else {
  9. //有错误字段,自行处理
  10. errorMapData1.put("isTime", true);
  11. for(Map.Entry<String, StringBuffer> m : errorMap.entrySet()){
  12. errorMapData.put(m.getKey(),m.getValue().toString());
  13. strb.append(m.getValue().toString()).append(",");
  14. }
  15. if(strb.length() > 0) {
  16. errorMapData1.put("result", strb.toString().substring(0, strb.length()-1));
  17. }
  18. }
  19. return errorMapData1;
  20. }

第四步,注解校验

在多个参数校验,或者@RequestParam 形式时候,需要在controller上加注@Validated

参考:      参数校验(validator)详解_xnn_fjj的博客-CSDN博客_validator

然后,做全局异常捕捉。捕获对不符合的字段,做出反应

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/310720
推荐阅读
相关标签
  

闽ICP备14008679号