springboot使用hibernate-validator校验请求参数

本文主要是介绍springboot使用hibernate-validator校验请求参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作为Web后台开发人员,对于api接口进行参数校验是非常必要的操作。可以说不进行参数校验是不负责任的开发。对参数校验才能使接口更加安全健壮。每个业务接口都有大量的参数需要校验。如果将这些参数放置到业务中使用if,else之类的判断则会显得代码不简洁。多了很多不必要的参数校验代码。验证代码繁琐,重复劳动。
在开发中使用hibernate-validator框架进行参数校验能非常友好的解决代码繁琐,重复劳动。Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。如果想了解更多有关 Hibernate Validator 的信息,请查看 http://www.hibernate.org/subprojects/validator.html

package com.xfl.boot.common.config;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;/*** Created by XFL* time on 2018/8/12 21:51* description:*/
@Configuration
public class ValidatorConfiguration {@Beanpublic Validator validator() {ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()//failFast:true  快速失败返回模式(只要有一个验证失败,则返回)    false 普通模式(会校验完所有的属性,然后返回所有的验证失败信息).addProperty("hibernate.validator.fail_fast", "true").buildValidatorFactory();Validator validator = validatorFactory.getValidator();return validator;}@Beanpublic MethodValidationPostProcessor methodValidationPostProcessor() {MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();//设置validator模式为快速失败返回postProcessor.setValidator(validator());return postProcessor;}
}
  @RequestMapping(value = "validation", method = RequestMethod.POST)public UserVo testValidation(@RequestBody @Valid UserVo userVo) {return userVo;}//Controller上需要增加注解@Validated@RequestMapping(value = "val", method = RequestMethod.GET)public UserVo testVal(@RequestParam("phone")@Pattern(regexp = "^((13[0-9])|(15[^4])|(18[0-9])|(17[0-8])|(147)|(166)|(199)|(198))\\\\d{8}$", message = "手机号码不正确")String phone) {return new UserVo();}

将参数校验失败异常进行转换

package com.xfl.boot.common.exception;import com.xfl.boot.entity.ResponseData;
import org.springframework.validation.ObjectError;
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.RestController;import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.List;/*** Created by XFL* time on 2017/6/20 21:53* description:统一异常处理*/
@ControllerAdvice(annotations = RestController.class)
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)//在返回自定义相应类的情况下必须有,这是@ControllerAdvice注解的规定@ResponseBodypublic ResponseData<Object> exceptionHandler(Exception e, HttpServletResponse response) {System.out.println(e);ResponseData<Object> responseData = new ResponseData<Object>();//参数校验未通过异常 @RequestBody参数校验失败if (e instanceof MethodArgumentNotValidException) {MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;List<ObjectError> errors = exception.getBindingResult().getAllErrors();StringBuffer sb = new StringBuffer();for (ObjectError error : errors) {String message = error.getDefaultMessage();sb.append(message).append(";");}responseData.setMsg(sb.toString());} else if (e instanceof ConstraintViolationException) {//@RequestParam 参数校验失败ConstraintViolationException exception = (ConstraintViolationException) e;StringBuffer sb = new StringBuffer();for (ConstraintViolation constraint : exception.getConstraintViolations()) {sb.append(constraint.getInvalidValue()).append("值不正确,").append(constraint.getMessage()).append(";");}responseData.setMsg(sb.toString());} else {//其他异常responseData.setMsg(e.getMessage());}responseData.setCode(9999);return responseData;}
}

手动对指定bean进行参数校验

/*** 使用hibernate的注解来进行验证*/private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator();/*** 功能描述: <br>* 〈注解验证参数〉** @param obj*/public static <T> void validate(T obj) {Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj);if (constraintViolations != null && constraintViolations.size() > 0) {StringBuffer sb = new StringBuffer();for (ConstraintViolation constraint : constraintViolations) {sb.append(constraint.getInvalidValue()).append("值不正确,").append(constraint.getMessage()).append(";");}System.out.println(sb.toString());
//            throw new AppExpection(1001,sb.toString());}}public static void main(String[] args) {UserVo userVo = new UserVo();userVo.setName("5");userVo.setPhone("1235655");validate(userVo);}

以下是对hibernate-validator中部分注解进行描述:

@AssertTrue 用于boolean字段,该字段只能为true
@AssertFalse 该字段的值只能为false
@CreditCardNumber 对信用卡号进行一个大致的验证
@DecimalMax 只能小于或等于该值
@DecimalMin 只能大于或等于该值
@Digits(integer=,fraction=) 检查是否是一种数字的整数、分数,小数位数的数字
@Email 检查是否是一个有效的email地址
@Future 检查该字段的日期是否是属于将来的日期
@Length(min=,max=) 检查所属的字段的长度是否在min和max之间,只能用于字符串
@Max 该字段的值只能小于或等于该值
@Min 该字段的值只能大于或等于该值
@NotNull 不能为null
@NotBlank 不能为空,检查时会将空格忽略
@NotEmpty 不能为空,这里的空是指空字符串
@Null 检查该字段为空
@Past 检查该字段的日期是在过去
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
@Size(min=, max=) 检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等
@URL(protocol=,host,port) 检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件
@Valid 该注解主要用于字段为一个包含其他对象的集合或map或数组的字段,或该字段直接为一个其他对象的引用,这样在检查当前对象的同时也会检查该字段所引用的对象

参考文章:
https://www.cnblogs.com/mr-yang-localhost/p/7812038.html#_label3_1

这篇关于springboot使用hibernate-validator校验请求参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970578

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置