一、jar包添加下面其中之一即可
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>根据实际情况指定版本号</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>根据实际情况指定版本号</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>因为springcloud项目已经引入spring-boot-starter-web
二、在实体中增加验证注解
注意下下面的注解中的groups属性作用:当实体用于不同的场景时,在验证时需要加以区分,此时需要用到分组。
如果不需要区分使用场景,可以去掉groups属性。
如本示例中,定义了两个分组Creation, Modification用于区分在新增、修改场景下对属性做不同的数据校验
public class RmRegionEntity extends BaseEntity{ private static final long serialVersionUID = -322027541582939044L; @NotBlank(message="区域主键不能为空!", groups = {Creation.class, Modification.class}) private String pkRegion; //区域主键 @NotNull(message="城市级别不能为空!", groups = {Creation.class, Modification.class}) private Integer fcitygrade; //城市级别:5071省级、5072地级、5073县级 @NotBlank(message="创建人名称不能为空!", groups = {Creation.class}) private String creatorName; //创建人名称 @NotBlank(message="修改人名称不能为空!", groups = {Modification.class}) private String modifierName; //修改人名称 }
三、在Controller中的使用
使用@Valid或@Validated,但当指定分组时需要使用@Validated
下面示例中,因用到分组,所以注解中传入了Creation,表示在数据校验时校验实体中分组为Creation的属性。
如果没用到分组,@Valid或@Validated都可以使用不用传值,直接使用即可
@PostMapping("/v1/insertRmRegion") public ResponseResult<Integer> insertRmRegion(@Validated({Creation.class}) @RequestBody RmRegionEntity rmRegionEntity) { ResponseResult<Integer> result = new ResponseResult<>(); Integer count = null; try { count = rmRegionService.insertRmRegion(rmRegionEntity); result.responseSuccess(null, count, "新增数据成功!"); }catch(BizException e) { logger.warn("业务异常", e); result.responseBizException(null, null, e.getMessage()); }catch(Exception e) { logger.error("新增信息出现异常", e); result.responseException(null, null, e.getMessage()); } return result; }四、分组定义
定义成一个空的接口即可
public interface Creation { }五、全局异常处理
如果要将校验的错误信息格式化成自己想要的格式,可以通过全局异常进行统一捕捉,然后返回错误信息。
类上增加注解@RestControllerAdvice
@RestControllerAdvice public class GlobelExceptionAdvice { private static final Logger logger = LoggerFactory.getLogger(GlobelExceptionAdvice.class); @Autowired private HttpServletRequest httpServletRequest; /** * 参数校验异常 * * @param exception * @return */ @ExceptionHandler({ MethodArgumentNotValidException.class }) public ResponseResult<String> methodArgumentNotValid(MethodArgumentNotValidException exception) { ResponseResult<String> result = new ResponseResult<>(); BindingResult bindingResult = exception.getBindingResult(); //返回第一个错误的信息 String defaultMessage = bindingResult.getFieldError().getDefaultMessage(); String code = bindingResult.getFieldError().getCode(); String field = bindingResult.getFieldError().getField(); result.responseBizException(code, field, defaultMessage); logger.warn("参数验证错误,错误信息: {}, 请求的URL: {}", result, httpServletRequest.getRequestURI()); return result; } /** * 参数校验异常 * * @param exception * @return */ @ExceptionHandler(value = BindException.class) public ResponseResult<String> bindException(BindException exception) { ResponseResult<String> result = new ResponseResult<>(); BindingResult bindingResult = exception.getBindingResult(); //返回第一个错误的信息 String defaultMessage = bindingResult.getFieldError().getDefaultMessage(); String code = bindingResult.getFieldError().getCode(); String field = bindingResult.getFieldError().getField(); result.responseBizException(code, field, defaultMessage); logger.warn("参数验证错误,错误信息: {}, 请求的URL: {}", result, httpServletRequest.getRequestURI()); return result; } /** * 数据类型校验异常 * @param exception * @return */ @ExceptionHandler(value = UnexpectedTypeException.class) public ResponseResult<String> unexpectedTypeException(UnexpectedTypeException exception) { ResponseResult<String> result = new ResponseResult<>(); result.responseBizException(null, exception.getMessage(), "数据类型错误!"); logger.warn("参数验证错误,错误信息: {}, 请求的URL: {}", result, httpServletRequest.getRequestURI()); return result; }属性验证注解
注解
适用的数据类型
说明
@AssertFalse
Boolean, boolean
验证注解的元素值是false
@AssertTrue
Boolean, boolean
验证注解的元素值是true
@DecimalMax(value=x)
BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence.
验证注解的元素值小于等于@ DecimalMax指定的value值
@DecimalMin(value=x)
BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence.
验证注解的元素值小于等于@ DecimalMin指定的value值
@Digits(integer=整数位数, fraction=小数位数)
BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence.
验证注解的元素值的整数位数和小数位数上限
@Future
java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial andReadableInstant.
验证注解的元素值(日期类型)比当前时间晚
@Max(value=x)
BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type ofCharSequence (the numeric value represented by the character sequence is evaluated), any sub-type of Number.
验证注解的元素值小于等于@Max指定的value值
@Min(value=x)
BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of CharSequence (the numeric value represented by the char sequence is evaluated), any sub-type of Number.
验证注解的元素值大于等于@Min指定的value值
@NotNull
Any type
验证注解的元素值不是null
@Null
Any type
验证注解的元素值是null
@Past
java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda Time date/time API is on the class path: any implementations ofReadablePartial andReadableInstant.
验证注解的元素值(日期类型)比当前时间早
@Pattern(regex=正则表达式, flag=)
String. Additionally supported by HV: any sub-type of CharSequence.
验证注解的元素值与指定的正则表达式匹配
@Size(min=最小值, max=最大值)
String, Collection, Map and arrays. Additionally supported by HV: any sub-type of CharSequence.
验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小
@Valid
Any non-primitive type(引用类型)
验证关联的对象,如账户对象里有一个订单对象,指定验证订单对象
@NotEmpty
CharSequence,Collection, Map and Arrays
验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@Range(min=最小值, max=最大值)
CharSequence, Collection, Map and Arrays,BigDecimal, BigInteger, CharSequence, byte, short, int, long and the respective wrappers of the primitive types
验证注解的元素值在最小值和最大值之间
@NotBlank
CharSequence
验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Length(min=下限, max=上限)
CharSequence
验证注解的元素值长度在min和max区间内
CharSequence
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
参考地址:
https://www.cnblogs.com/moues/p/11399421.html
https://blog.51cto.com/1197822/2467086
https://blog.csdn.net/songguopeng/article/details/98961787
