java简单好用的参数验证工具spring 容器都可使用

197 阅读3分钟

1、springboot 接入

第一步 引入xml


        <dependency>
               <groupId>com.github.fashionbrot</groupId>
               <artifactId>validated-springboot-starter</artifactId>
               <version>2.0.1</version>
        </dependency>

第二步 使用@Validated开启接口参数验证

@Controller
public class EmailController {

    @RequestMapping("/emailCheck")
    @ResponseBody
    @Validated //注意此处
    public String demo(@Email(msg="邮箱格式不正确,请重新填写") String email){
        return email;
    }

    @RequestMapping("/emailCheck2")
    @ResponseBody
    @Validated //注意此处
    public String demo(EmailMode emailMode){
        return emailMode.toString();
    }

    @Data
    @ToString
    class EmailMode{

        @Email(msg="邮箱格式不正确,请重新填写")
        private String email;
    }
}

验证结果

微信截图_20211203144214.png

微信截图_20211203145913.png

2、springmvc 接入

第一步引入xml

        <dependency>
            <groupId>com.github.fashionbrot</groupId>
            <artifactId>mars-validated</artifactId>
            <version>2.0.1</version>
        </dependency>

第二步引入spring容器

@Component
@Configuration
//使用 @EnableValidatedConfig 开启注入
@EnableValidatedConfig(fileName = "valid",language="zh_CN",localeParamName="lang") 
public class ValidConfig {
    //fileName 代表配置文件名  !!!不使用可以不配置
    //language 代表语言   !!!不使用可以不配置
    //localeParamName 代表接受参数名(为支持错误提示内容国际化实现) !!!不使用可以不配置
}

第三步 使用验证

@Controller
public class EmailController {

    @RequestMapping("/emailCheck")
    @ResponseBody
    @Validated //注意此处
    public String demo(@Email(msg="邮箱格式不正确,请重新填写") String email){
        return email;
    }

    @RequestMapping("/emailCheck2")
    @ResponseBody
    @Validated //注意此处
    public String demo(EmailMode emailMode){
        return emailMode.toString();
    }

    @Data
    @ToString
    class EmailMode{

        @Email(msg="邮箱格式不正确,请重新填写")
        private String email;
    }
}

验证结果

33333.png

444444.png

@Validated 注解支持功能

方法作用
Class<?>[] validClass() default {}需要校验的 class
Class<?>[] groups() default { }校验组
boolean failFast() default truetrue 快速失败
boolean validReturnValue() default false验证返回值 默认false

已知注解

AnnotationSupported data types作用
NotBlankString验证String 字符串是否为空
NotNullString,Object,Integer,Long,Double,Short,Float,BigDecimal, BigInteger验证对象是否为空
NotEmptyString验证字符串不能为空
AssertFalseBoolean,boolean,String只能为false
AssertTrueBoolean,boolean,String只能为true
BankCardString验证银行卡
CreditCardString验证信用卡
DefaultInteger,Double,Long,Short,Float,BigDecimal,String设置默认值
DigitsString验证是否是数字
EmailString验证是否是邮箱
IdCardString验证是否是身份证,验证18岁
Lengthint,long,short,double,Integer,Long,Float,Double,Short,String验证长度
PatternString正则表达式验证
PhoneString验证手机号是否正确
Sizeobject[],boolean[],byte[],char[],double[],float[],int[],long[],short[],String length,Collection,Map验证大小值
NotEqualLengthString验证长度

支持自定义注解

//第一步添加一个自定义注解
@Documented
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {CustomBeanConstraintValidatorBean.class})
public @interface CustomBean {
    //没有任何参数

}

//第二步 实现自定义注解接口 ConstraintValidator
public class CustomBeanConstraintValidatorBean implements ConstraintValidator<CustomBean, Object> {

    //验证单个属性逻辑
    @Override
    public boolean isValid(CustomBean annotation, Object value, Class<?> valueType) {
        return true;
    }

    //验证 Class 类逻辑
    @Override
    public String validObject(CustomBean custom, Object var,Class<?> valueType) {

        if (var instanceof ValidBeanModel){
            ValidBeanModel beanModel= (ValidBeanModel) var;
            if (beanModel!=null && (beanModel.getA1()==null || beanModel.getA2()==null)){
                return "a1 或者 a2 为空";
            }
        }
        /**
         * return null 则验证成功 其他验证失败
          */
        return null;
    }
    //验证过程中,修改 class 属性值逻辑
    @Override
    public Object modify(CustomBean annotation, Object var,Class<?> valueType) {
        System.out.println("CustomConstraintValidator:"+var);
        if (var instanceof ValidBeanModel){
            ValidBeanModel beanModel= (ValidBeanModel) var;
            beanModel.setA1("1");
            beanModel.setA2("2");
            return beanModel;
        }
        return var;
    }
}




//第三步使用


@Controller
@RequestMapping("custom")
public class CustomController {

    @RequestMapping("demo1")
    @ResponseBody
    @Validated(failFast = false)
    public String demo1(@Custom(min=1)String abc){

        return abc;
    }

    @RequestMapping("demo2")
    @ResponseBody
    @Validated
    public String demo2(@Custom(min=1) DefaultModel defaultModel){

        return JSON.toJSONString(defaultModel);
    }

    @RequestMapping("demo3")
    @ResponseBody
    @Validated
    public String demo3(@Custom(min=1) CustomModel customModel){

        return customModel.getAbc();
    }
}

支持 自定义aop 实现验证

@Component
@Aspect
public class ValidAspect {

    @Pointcut("execution(* com.github.fashion.test.service.*.*(..))")
    private void pointcut() {}

    @Autowired
    private MarsValidator marsValidator;

    @Around(value = "pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        //打印方法的信息
        Object[] args = joinPoint.getArgs();
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature)signature;
        //自定义参数验证
        marsValidator.parameterAnnotationValid(methodSignature.getMethod(),args);

        return joinPoint.proceed();
    }

}

使用全局异常拦截器

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ValidatedException.class)
    @ResponseStatus(HttpStatus.OK)
    public Object ValidatedException(ValidatedException e) {
        List<MarsViolation> violations = e.getViolations();
        return String.join(",",violations.stream().map(m-> m.getMsg()).collect(Collectors.toList()));
    }

}

支持 国际化消息提示(现支持中英文两种)

请求:http://localhost:8080/l18n/test?lang=en_us
提示:must not be empty
请求:http://localhost:8080/l18n/test?lang=zh_CN
提示:不能为空

其他语言需要自行添加到项目 resources 下 properties文件
@RequestMapping("/l18n")
@Controller
public class I18nController {

    @RequestMapping("/test")
    @ResponseBody
    @Validated
    public String test(@NotEmpty() String abc){
        return abc;
    }

}

如果有问题可参考demo

github.com/fashionbrot…

如果有bug可通过已下反馈

github.com/fashionbrot…

如果您觉得工具不错,还请你帮忙点个 Star github地址:github.com/fashionbrot…