Springboot集成Hibernate-Validator验证

本文详细介绍HibernateValidator中常用的注解及其用途,包括@Null、@NotNull等,并提供了配置类和异常处理的示例代码,帮助读者理解如何在项目中应用这些注解进行数据验证。
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
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
// 如果不是springboot
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.14.Final</version>
</dependency>

4、参考文章:

https://www.jianshu.com/p/d6dc00f89ebe
https://blog.youkuaiyun.com/dh554112075/article/details/80790464

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cocosum

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值