赞
踩
通过注解的方式,对业务代码的整体侵扰比较少
举个例子,有个实体类名字。我只让它输入中文数字字母逗号, 首先加建一个注解
第一步
- 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.Payload;
-
- import com.test.utils.validator.IsCNValidator;
-
-
- @Target({ElementType.FIELD, ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- @Constraint(validatedBy=IsCNValidator.class)
- public @interface IsCN {
-
- String message() default"内容输入错误,只允许输入中文或字母和,";
-
- Class<?>[] groups() default {};
-
- Class<? extends Payload>[] payload() default {};
- }
第二步
-
- import javax.validation.ConstraintValidator;
- import javax.validation.ConstraintValidatorContext;
-
- import com.test.annotation.IsCN;
-
- import java.util.regex.Pattern;
- public class IsCNValidator implements ConstraintValidator<IsCN, String>{
- String regex = "^[a-z0-9A-Z\u4e00-\u9fa5\uff0c]+$";
- private Pattern moneyPattern = Pattern.compile(regex);
- @Override
- public void initialize(IsCN constraintAnnotation) {
- //获取注解上的值,可以做一写取注解上的值做一下判断
- }
-
- @Override
- public boolean isValid(String value, ConstraintValidatorContext context) {
-
- if (value == null)
- //是空的,返回true,是因为如果null,则会有@NotBlank进行提示,如果没有 @NotBlank进行提示则返回false
- return true;
- return moneyPattern.matcher(value.toString()).matches();
-
- }
-
- }
这两个字段要一样,对应标记字段的类型。如果字段是 List apiList 这样的,则 把String 变成List
第三步
- //人员
- @Length(max=40)
- @IsCN(message="工作人员内容输入错误,只允许输入中文或字母和!")
- @IsNullOr(message="工作人员内容输入错误,不允许输入null/NULL!")
- @NotBlank(message="请填写工作人员!")
- private String GZRY;
第四步,手动校验
-
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Set;
-
- import javax.validation.ConstraintViolation;
- import javax.validation.Validation;
- import javax.validation.Validator;
- import javax.validation.groups.Default;
-
- /**
- * 对新增加的数据做校验
- * @author liunn
- *
- */
- public class ValidatorUtil {
- private static Validator validator = Validation.buildDefaultValidatorFactory()
- .getValidator();
-
- public static <T> Map<String,StringBuffer> validate(T obj){
- Map<String,StringBuffer> errorMap = null;
- Set<ConstraintViolation<T>> set = validator.validate(obj,Default.class);
- if(set != null && set.size() >0 ){
- errorMap = new HashMap<String,StringBuffer>();
- String property = null;
- for(ConstraintViolation<T> cv : set){
- //这里循环获取错误信息,可以自定义格式
- property = cv.getPropertyPath().toString();
- if(errorMap.get(property) != null){
- errorMap.get(property).append("," + cv.getMessage());
- }else{
- StringBuffer sb = new StringBuffer();
- sb.append(cv.getMessage());
- errorMap.put(property, sb);
- }
- }
- }
- return errorMap;
- }
-
-
- }
校验
- //获取错误实体类上标记的错误提示,为null代表,字段正常
- Map<String, StringBuffer> errorMap =ValidatorUtil.validate(entity);
- Map<String, Object> errorMapData = new HashMap<String, Object>();
- Map<String, Object> errorMapData1 = new HashMap<String, Object>();
- StringBuffer strb = new StringBuffer();
- if(errorMap==null) {
- //校验通过,
- }else {
- //有错误字段,自行处理
- errorMapData1.put("isTime", true);
- for(Map.Entry<String, StringBuffer> m : errorMap.entrySet()){
- errorMapData.put(m.getKey(),m.getValue().toString());
- strb.append(m.getValue().toString()).append(",");
- }
- if(strb.length() > 0) {
- errorMapData1.put("result", strb.toString().substring(0, strb.length()-1));
- }
- }
- return errorMapData1;
- }
第四步,注解校验
在多个参数校验,或者@RequestParam 形式时候,需要在controller上加注@Validated
参考: 参数校验(validator)详解_xnn_fjj的博客-CSDN博客_validator
然后,做全局异常捕捉。捕获对不符合的字段,做出反应
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。