Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

一个校验器框架,提供注解校验方法参数和对象属性的功能,类似Hibernate-Validator功能

License

Notifications You must be signed in to change notification settings

hellogy/validators

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

4 Commits

Repository files navigation

validators

功能概述

一个校验器框架,提供注解校验方法参数和对象属性的功能,在方法运行前,拦截方法并执行参数校验,如果校验失败可以抛出自定义异常和信息;便于拓展自定义校验器。
开发时,参考了Hibernate-Validator 5.x,但是没有做到兼容,因为JSR-303提供的注解的方法太少,不方便拓展,所以写了这个框架。

运行环境

要求JDK1.8+

v1.0.0

日期:2018年02月05日
更新说明:

  1. 重新声明1.0.0版本
  2. 增加@ValidateInside标记注解,表示是否校验对象内部;
  3. 增加了@Each校验器注解,自动校验数组、集合和Map内的值集合

使用说明:

  1. 在spring容器中定义io.github.shenbinglife.validators.spring.SpringValidatorAdvisor, 这是校验器的切面拦截功能,会默认拦截所有的标记有@Validators的方法或类上面有@Validators注解的内部所有方法。

     @Bean
     public SpringValidatorAdvisor springValidatorAdvisor() {
     return new SpringValidatorAdvisor;
     }
    
  2. 现在可以使用框架中自带的校验器注解。

    • 在任意方法上标记@Validators注解,表明校验该方法运行时的入参。
    • 在任意类上标记@Validators注解,表明校验该类中所有方法运行时的入参。
    • 在任意类上标记@Validators注解,表明校验该类中所有方法运行时的入参。
     @Controller
     @RequestMapping("users")
     public UserController {
     
     @Validators
     @RequestMapping(method = RequestMethod.POST)
     @ResponseBody
     public User create(@NotNull User user) {
     ...
     }
     }
    
  3. 在非spring环境使用校验器功能

     //定义普通的POJO类型
     //标记校验对象内部字段的注解,否则默认不去校验对象内部字段
     @ValidateInside
     class User {
     @IntRange(max = 1880, min = 5)
     private int age;
     
     @NotBlank
     private String name;
     
     @Length(min = 10)
     private List<String> list;
     }
     
     //校验对象
     @org.junit.Test
     public void testValidator() {
     User user = new User();
     user.setAge(0);
     user.setList(Lists.newArrayList("12"));
     user.setName("asdf");
     ValidateContext context = ValidateContext.newInstance();
     //fastFailed=false表示即使校验过程中,存在校验失败,将校验结果仍然收集到校验收集器中,而不是立即抛出异常.
     context.setFastFailed(false); 
     ValidatedTarget validatedTarget = new ValidatedTarget(user, context);
     ValidateCollector check = validatedTarget.check();
     System.out.println(check.getSimpleValidateResults());
     }
    
  4. 框架内部可用校验器注解

    • 校验器注解的具体使用方法,可以阅读源代码的api注释文档。
    • 注意该框架的校验器的包名为io.github.shenbinglife.validators.anno.cfg
    • 下列校验器注解,默认都不会产生校验对象内部字段的功能。如需校验对象内部字段,请使用后文提到的@ValidateInside注解。
     @Blank: 字符串必须为空
     @Each: 遍历数组或列表、Map执行校验器
     @Equals: toString方法的返回值必须和指定的字符串相同
     @False: boolean, Boolean类型的值必须为false
     @In: 对象必须包含在指定的数组中
     @InEnum: 对象必须在指定的枚举类型中
     @IntRange: 数字必须在指定的范围
     @Length: 字符串长度或数组、列表长度在指定范围
     @MultiValidate: 注入指定的一个或多个校验器校验对象
     @NotBlank: 字符串不能为null或为空字符串,多个空白字符也不允许
     @NotIn: 对象不能在指定的数组内
     @NotNull: 对象不能为null
     @Null: 对象必须为null
     @Reflect: 通过反射执行一个指定的方法,其中被校验对象作为入参,最后指定校验器校验方法的运行结果
     @Regex: 正则表达式校验字符串
     @True: boolean, Boolean类型的值必须为true
    
    • 特殊的元数据注解
     @Validators: 标记在类上或方法上,表示校验切面拦截位置
     @Groups: 标记在被校验方法上或入参上,表示当前的校验组
     @ValidateInside: 标记在被校验方法的入参或POJO字段上,表示校验对象内部字段
     @ArrayCheck: 在自定义注解时,标记在自定义校验注解上,表示被校验对象是数组或列表时,仅遍历校验内部元素。
     @MsgFiller: 在自定义注解时,标记在自定义注解的内部方法上,表示该方法的值可以在emsg插值中使用。
     @ComplexValidateMeta: 在自定义注解时,标记在自定义注解上,表示该注解使用的具体的校验执行器。
     @ValidateEx: 校验异常注解,校验失败时将ValidateException替换为指定的异常并抛出
    
  5. 自定义校验器及注解:

    1. 自定义一个注解,必须有ecode、emsg、groups、field四个方法。注解上要有@ComplexValidateMeta标明注解在运行时使用的校验器,示例如下:
     /**
     * 字符串为空或为null
     *
     * @author shenbing
     * @version 2017年11月17日
     * @since 1.0
     */
     @Documented
     @Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.FIELD})
     @Retention(RetentionPolicy.RUNTIME)
     @ComplexValidateMeta(value = ValidatorNames.BLANK_VALIDATOR, clazz = StringBlankValidator.class)
     public @interface Blank {
     
     /**
     * 默认使用的异常码
     */
     int ecode() default Consts.DEFAULT_ECODE;
     
     /**
     * 默认使用的异常信息
     */
     String emsg() default "${field}字符串必须为空";
     
     /**
     * 校验器组
     */
     String[] groups() default {};
     
     /**
     * 被校验字段名称
     */
     String field() default Consts.DEFAULT_FIELD;
     }
    
    1. 实现一个校验器,实现io.github.shenbinglife.validators.ComplexValidator接口, 并且将其注入Spring容器中。
     @Component //spring注解,表示将该对象注入spirng容器内。这样spring启动时,验器注册中心会自动注册该校验器。
     public class StringBlankValidator implements ComplexValidator<String, Blank> {
     @Override
     public boolean validate(String object, Blank annotation, ValidateContext context) {
     return validate(object, context);
     }
     }
    
    1. 在需要进行参数校验的地方使用该注解
     @Validators //标记注解,启用验证器AOP拦截
     public append(@Blank String str) {
     ...
     }
    

About

一个校验器框架,提供注解校验方法参数和对象属性的功能,类似Hibernate-Validator功能

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%

AltStyle によって変換されたページ (->オリジナル) /