在SpringBoot中使用FluentValidator验证插件
前言
在我们编写项目的时候,在controller中往往离不开对一些数据的校验。这里并不是说对于这些数据业务上面的校验,而是对这些数据进行空校验或者是长度校验等。
有些时候校验可以省略,根据业务的需要进行调整,而多数情况下,服务端对客户端一直采用的是不信任的策略,所以对很多参数都需要进行校验。
而校验的目的就是为了安全有序的执行之后的业务逻辑。从而一定程度的上的减轻数据库的压力了,不要让数据库成为你校验数据的工具。
但是这样的校验总是显得很复杂而且很臃肿,复用性也不高,所以我准备使用FluentValidator这个插件帮助我完成这个任务。
已经加入我的github模版中:https://github.com/LinkinStars/springBootTemplate
FluentValidator简介
FluentValidator是百度的一个开源验证插件,我习惯这样叫它,简单的说,它就是为了校验数据简单并且复用而存在的。
通过这个插件,你可以对接收到的数据进行你所需要的校验,并且返回对应的错误信息,同时它还提供一些比较不错的显示错误的功能。
其实我主要使用它的原因在于,它的复用性高和代码简洁。
FluentValidator使用
使用gradle导入依赖
compile (group: 'com.baidu.unbiz', name: 'fluent-validator-jsr303', version: '1.0.9'){
exclude module: 'slf4j-log4j12'
}需要注意的是需要防止jar冲突,所以需要排除一些依赖,你可以根据自己的需要使用。或者如果使用maven或者自行下载jar均可
新建NotNullStringValidator.java
package com.linkinstars.springBootTemplate.validator;
import com.baidu.unbiz.fluentvalidator.ValidationError;
import com.baidu.unbiz.fluentvalidator.Validator;
import com.baidu.unbiz.fluentvalidator.ValidatorContext;
import com.baidu.unbiz.fluentvalidator.ValidatorHandler;
/**
* 字符串非空校验
* @author LinkinStar
*/
public class NotNullStringValidator extends ValidatorHandler<String> implements Validator<String> {
//需要被校验字符串的字段名
private String fieldName;
public NotNullStringValidator(String fieldName) {
this.fieldName = fieldName;
}
/**
* 校验方法
* @param checkedString 需要被校验字符串
*/
@Override
public boolean validate(ValidatorContext context, String checkedString){
if (null == checkedString || "" == checkedString) {
context.addError(ValidationError.create(String.format("%s不能为空!", fieldName))
.setErrorCode(-1)
.setField(fieldName)
.setInvalidValue(checkedString));
return false;
}
return true;
}
}
在需要校验的地方这样使用
//测试校验字符串参数
String checkedString = "";
Result validatorResult = FluentValidator.checkAll()
.on(checkedString, new NotNullStringValidator("测试姓名"))
.doValidate()
.result(ResultCollectors.toSimple());
if (!validatorResult.isSuccess()) {
System.out.println(validatorResult.getErrors());
}
如果需要校验多个字段,直接在.on后面继续.on即可如
.on(checkedString1, new NotNullStringValidator("测试姓名")).on(checkedString2, new NotNullStringValidator("测试帐号"))如果需要验证不同的情况,如验证数字的大小,验证手机号等,只需编写新的的Validator的类就可以了这里只是举例字符串的简单校验而已。
总结
使用这样的校验方式,可以在复用很多的校验规则,同时返回你所需要的错误信息,而且它提供了错误码可以自己定义编号,校验也会变的很清晰。使用的时候要注意下面几点,首先是要明确校验的规则,不能盲目的校验,还有就是有些时候需要特殊校验的就手动编写不一定非要都用插件校验。这个插件还有很多的功能,我只是提出了我所需要的功能和方式,具体更多的用法可以参考:
http://ju.outofmemory.cn/entry/241915