View on GitHub

alita-validator

a validator component extracted from alita(https://alita.klw8.top/)

Alita Validator

License

从Alita项目中抽取出来的注解验证器, 用于对方法参数做验证,如常用的非空,手机号格式,邮箱格式,数字范围等. 通常用于HTTP项目(包括Restful)中客户端提交的参数的验证

大家可能会问,spring MVC支持验证注解,如常用的hibernate-validator,为什么要自己实现一套呢? 最近做一个APP的服务端接口,项目中有自己的业务返回码.spring MVC支持的注解验证器无法设置验证不通过的时候的返回码,各种不方便,所以思前想后还是自己实现了一套

主要功能

更新日志

0.9

0.8

0.7

0.6

0.6

0.5

0.4

0.3

未来规划

开始使用

maven引入:

<dependency>
    <groupId>top.klw8.alita</groupId>
    <artifactId>alita-validator</artifactId>
    <version>0.8</version>
</dependency>

开发一个responseMsgGenerator:

responseMsgGenerator 作为验证错误的响应生成器,用于生成当验证不通过时被调用方法的返回的值,例如WBE项目用于验证客户端提交的参数,可以返回一个统一的响应结构.

实现top.klw8.alita.validator.IResponseMsgGenerator接口,根据传入的自定义错误码和自定义错误消息生成对应的返回值

开启验证器:

在配制类(标注了@Configuration的类)或者spring boot 启动器(标注了@SpringBootApplication的类)的类中加上类注解:

@EnableValidator(responseMsgGenerator = ValidatorResponseGenerator.class)

其中 responseMsgGenerator 为上面开发的 responseMsgGenerator

使用验证器:

在需要验证的方法上加上方法注解 top.klw8.alita.validator.UseValidator:

@UseValidator
public CustomResult xxx(Demo demo)

在Demo类的属性上加上具体验证器:

@Required(validatFailMessage = "姓名不能为空", responseStatusCode="5008")
private String fullName;

开发验证器

验证器注解可以在使用的项目中单独开发,通过配置项”alita.validator.custom.packages” 指定验证器实现所在包就行,多个包路径用逗号分隔,验证器注解在哪个包无所谓.当然也欢迎各种PR~(如果要PR,则验证器注解必须放在 “top.klw8.alita.validator.annotations”包下,实现必须放在”top.klw8.alita.validator.annotations.impl”包下)

定义验证器注解

验证器注解可以放在任意包中

例如开发一个非空验证器(当值不为null的时候判断是否空,为null不处理):

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented
@Inherited
@ThisIsValidator
public @interface NotEmpty {

    @AliasFor("validatFailMessage")
    String value() default "";
    
    /**
     * @Title: responseStatusCode
     * @Description: 验证失败(不通过)的code
     * @return
     */
    String responseStatusCode() default "500";
    
    /**
     * @Title: validatFailMessage
     * @Description: 验证失败(不通过)的文字消息,可为空,默认使用ResponseStatusCodeEnum对应的消息
     * @return
     */
    @AliasFor("value")
    String validatFailMessage() default "";
    
    
    // 更多参数...
}

上面例子中的value,responseStatusCode和 validatFailMessage 为每个验证器必须有的参数,当然还可以增加更多的参数,在验证器实现解析

开发验证器实现类

验证器实现可以放在任意包中,然后在配制中指定包路径

需要实现 top.klw8.alita.validator.IAnnotationsValidator 接口

@ValidatorImpl(validator = NotEmpty.class)  //标注该实现是哪个验证器的实现,如果是多个验证器共有的实现则可以validator = {NotEmpty.class, Xxx.class}
public class NotEmptyImpl implements IAnnotationsValidator {

    @Override
    public void doValidator(Object object, Annotation annotation) throws Exception {
	NotEmpty notEmpty = (NotEmpty) annotation;
	String statusCode = notEmpty.responseStatusCode();
	String message = notEmpty.validatFailMessage();
	if (object != null) {
	    if (object.getClass().isArray()) {
		ValidatorUtil.notEmpty((Object[]) object, statusCode, message);
	    } else if (object instanceof Collection) {
		ValidatorUtil.notEmpty((Collection<?>) object, statusCode, message);
	    } else if (object instanceof Map) {
		ValidatorUtil.notEmpty((Map<?, ?>) object, statusCode, message);
	    } else if (object instanceof String) {
		ValidatorUtil.hasText((String) object, statusCode, message);
	    }
	}
    }

}

验证器实现不返回任值,验证不通过时抛出 top.klw8.alita.validator.ValidatorException 异常即可