本文共 5299 字,大约阅读时间需要 17 分钟。
Springboot集成Hibernate-Validator验证
Hibernate Validator常用注解
注解 释义 @Null 必须为null @NotNull 不能为null @AssertTrue 必须为true @AssertFalse 必须为false @Min 必须为数字,其值大于或等于指定的最小值 @Max 必须为数字,其值小于或等于指定的最大值 @DecimalMin 必须为数字,其值大于或等于指定的最小值 @DecimalMax 必须为数字,其值小于或等于指定的最大值 @Size 集合的长度必须在指定范围内 @Digits 必须为数字,其值必须再可接受的范围内 @Past 必须是过去的日期 @Future 必须是将来的日期 @Pattern(regex = , flag = ) 必须符合正则表达式 @Email 必须是邮箱格式 @Length 长度范围 @NotEmpty 不能为null,长度大于0 @Range 元素的大小范围 @NotBlank 不能为null,字符串长度大于0(限字符串)1、配置类
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;import javax.validation.Validation;
import javax.validation.Validator; import javax.validation.ValidatorFactory;/**
验证属性配置
@author: fyk
@create: 2019/11/4 22:37
**/ @Configuration public class ValidatorConfiguration { //配置1 @Bean public Validator validator() { ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) .configure() .addProperty(“hibernate.validator.fail_fast”, “true”) //快速验证模式,有第一个参数不满足条件直接返回 .buildValidatorFactory(); return validatorFactory.getValidator(); }//配置2
@Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); postProcessor.setValidator(validator()); return postProcessor; } } 2、捕捉异常 ,全局捕捉异常import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.UnauthorizedException; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.Set;/**
全局异常捕捉
@Author: fanyuke
@Date : 2019年8月27日下午12:00:21
*/ @RestControllerAdvice public class HandExceptionRes {/**
自定义方法, 通过获取的Exception 判断Exception的异常信息来自定义返回值
返回值可为json、ModelAndView、直接response 等等
@Author: fanyuke
@Date : 2019年8月27日下午2:07:25
@param : @param request
@param : @param response
@param : @param e
@param : @return
@param : @throws Exception
@return: Object
*/ @ExceptionHandler(value = Exception.class) public Object errorHandler(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception { // 得到请求URL地址时使用的方法 String method = request.getMethod(); // 定义一个返回的json对象(你们要返回什么自己来,把上面的返回值改一下就行了) JSONObject json = new JSONObject();// 捕捉请求方式
if (e instanceof HttpRequestMethodNotSupportedException) { json.put(“status”, 0); json.put(“msg”, “不支持” + method + “请求.”); } // 空指针异常 if (e instanceof NullPointerException) { json.put(“status”, 0); json.put(“msg”, “系统错误”); } // 捕捉权限异常shiro if (e instanceof UnauthorizedException || e instanceof AuthorizationException) { json.put(“status”, 0); json.put(“msg”, “您没有权限.”); } // 抛出http异常 if (e instanceof IllegalArgumentException) { throw new IllegalArgumentException(); }/Bean Validator*/
// 其实就是运行时异常 if (e instanceof RuntimeException) { json.put(“status”, 0); json.put(“msg”, “系统异常”); } if (e instanceof BindException) { BindingResult bindingResult = ((BindException) e).getBindingResult(); ObjectError objectError = bindingResult.getAllErrors().get(0); json.put(“status”, 0); json.put(“msg”, objectError.getDefaultMessage()); } // Spring Validator参数校验异常处理 if (e instanceof ConstraintViolationException) { Set<ConstraintViolation<?>> constraintViolations = ((ConstraintViolationException) e).getConstraintViolations(); json.put(“status”, 0); for (ConstraintViolation<?> constraintViolation : constraintViolations) { String message = constraintViolation.getMessage(); if (!StringUtils.isEmpty(message)) { //直接返回第一个错误信息 json.put(“msg”, message); } } if (json.get(“msg”) == null || “”.equals(json.get(“msg”))) { json.put(“msg”, “参数错误”); } } // Hibernate Validator参数校验异常处理 if (e instanceof MethodArgumentNotValidException) { BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult(); ObjectError objectError = bindingResult.getAllErrors().get(0); json.put(“status”, 0); json.put(“msg”, objectError.getDefaultMessage()); } /end Bean Validator*/return json;
}}
实现验证功能 在控制类上面添加@Validated注解: 如果方法参数是对象,就用Hibernate的@Valid注解,它会自动去验证, 如果方法参数是单个单个的属性,那么在属性前面加上自己的验证,如@Length(min = 2, message = “长度不能小于2”) 全局捕获异常: 看的到我的都是返回一个JSONObject对象, 我的后台统一返回的格式(所有接口的返回格式,异常处理之后返回格式): { “status”: “0”, “msg”: “系统异常”,“data”: null} // 返回失败的状态,或者验证失败 { “status”: “1”, “msg”: “”, “data”: null} // 返回成功,验证成功。 3、依赖// 如果是springboot,引入下面的即可,spring-boot-starter-web有继承hibernate-validator
org.springframework.boot spring-boot-starter-web // 如果不是springboot org.hibernate.validator hibernate-validator 6.0.14.Final ———————————————— 版权声明:本文为CSDN博主「cocosum」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_40058321/article/details/102910367