版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wm5920/article/details/85693978
做后端的同学都知道参数校验实在是太繁琐的事情,今天我们就借助于hibernate.validator实现解放我们的双手,让校验变得赏心悦目
手写的一个工具类
package com.util;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.constraints.*;
import javax.validation.*;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* 对象校验工具类
*/
public class ValidatorUtil {
private Validator val;
private ValidatorUtil(){
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
// 是否快速返回错误,false返回全部错误,true只返回第一条错误
.addProperty( "hibernate.validator.fail_fast", "false" )
.buildValidatorFactory();
val = validatorFactory.getValidator();
}
public static ValidatorUtil getIns(){
return Holder.ins;
}
private static class Holder{
private static ValidatorUtil ins=new ValidatorUtil();
}
public <T> String getMsg(T model){
Set<ConstraintViolation<T>> violationSet = val.validate(model);
StringBuilder sb=new StringBuilder();
for (ConstraintViolation<T> m : violationSet) {
sb.append(m.getMessage()).append(" ");
}
return sb.toString();
}
public static void main(String[] args) {
Demo d=new Demo();
d.list=new ArrayList<>();
d.str="";
System.out.println(ValidatorUtil.getIns().getMsg(d));
}
}
/**
* 常用
*/
class Demo{
@NotBlank(message = "name空")
public String name;
@NotNull(message = "name1空")
public String name1;
@NotEmpty(message = "name2空")
public String name2;
@NotEmpty(message = "email空")
@Email(message = "email格式错误")
public String email;
@NotEmpty(message = "list空")
public List<String> list;
@Range(min=1,max=5,message = "不在range")
public Integer num;
@Min(value = 1,message = "最低1")
@NotEmpty(message = "num1空")
public Integer num1;
@Max(value =2 ,message = "最大2")
@NotNull(message = "num2空")
public Integer num2;
@Length(min = 1, max = 20, message = "字符串过长")
public String str;
//级联
@Valid
List<Demo> ds;
}
使用方法见demo与main
spring boot项目中集成
再controller方法中添加注解
@RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public ResponseData addOrUpdate(@Valid @RequestBody TemplateVo vo) {
vo中属性加上校验注解,参考demo类
再添加到异常处理拦截器,这样当参数校验失败时,自动拦截返回自定义消息对象
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
public class DefaultExceptionHandler {
@ExceptionHandler({MethodArgumentNotValidException.class})
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Object validException(MethodArgumentNotValidException e) {
System.out.println(ValidUtil.getErrors(e.getBindingResult())))
return new Object();
}
}
ValidUtil
import java.util.Iterator;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
public class ValidUtil {
public ValidUtil() {
}
public static String getErrors(BindingResult bindingResult) {
String errorMesssage = "校验信息:\n";
FieldError fieldError;
if (bindingResult.hasErrors()) {
for(Iterator var2 = bindingResult.getFieldErrors().iterator(); var2.hasNext(); errorMesssage = errorMesssage + fieldError.getDefaultMessage() + "\n") {
fieldError = (FieldError)var2.next();
}
}
return errorMesssage;
}
}