Java中使用 hibernate-validator 校验参数
hibernate-validator官网
平时在开发过程中我们使用if判断来验证参数是否正确,如果验证的参数比较多就要写一堆if判断代码,代码看起来非常多,如果使用hibernate-validator来校验参数就非常方便也不用写大量的if判断
1.引入pom依赖
版本号可以自己改
<!-- 参数校验 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
2.验证参数
1. json格式验证
- 创建一个Java对象
package com.xhs.annotation.request;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* @desc: 用户入参
* @author: xhs
* @date: 2021/5/24 14:09
* @version: JDK 1.8
*/
@Data
public class UserRequest {
/**
* 用户名
*/
@NotEmpty(message = "用户名不能为空")
private String userNm;
/**
* 密码
*/
@NotEmpty(message = "密码不能为空")
private String pwd;
}
- 创建controller
注意@Valid
注解就是验证参数的
package com.xhs.annotation.controller;
import com.xhs.annotation.request.UserRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.util.HashMap;
/**
* @desc:
* @author: xhs
* @date: 2021/5/24 14:18
* @version: JDK 1.8
*/
@Slf4j
@RestController
public class UserController {
@PostMapping("/user")
public HashMap<String, Object> user(@RequestBody @Valid UserRequest userRequest) {
HashMap<String, Object> map = new HashMap<>(16);
map.put("code", 200);
map.put("msg", "处理成功");
map.put("data", userRequest);
return map;
}
}
- 使用SpringMVC中的
@ControllerAdvice
注解全局异常处理来处理参数
package com.xhs.annotation.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.HashMap;
import java.util.Set;
/**
* @desc: 全局异常处理
* @author: xhs
* @date: 2021/5/24 14:23
* @version: JDK 1.8
*/
@Slf4j
@RestControllerAdvice
public class GlobalException {
@ExceptionHandler
public HashMap<String, Object> exceptionHandler(Exception e) {
log.info(">>>>>>>>>>>>>>>>>>全局异常:{}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", e.getMessage());
HashMap<String, Object> map = new HashMap<>(16);
map.put("code", 500);
map.put("msg", "系统处理失败,请联系管理员");
return map;
}
/**
* JSON格式参数校验失败
*
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public HashMap<String, Object> validateHandlerJson(MethodArgumentNotValidException e) {
log.info(">>>>>>>>>>>>>>>>>>JSON格式参数校验失败:{}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", e.getMessage());
HashMap<String, Object> map = new HashMap<>(16);
map.put("code", 500);
map.put("msg", "参数校验失败");
map.put("msg", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return map;
}
/**
* 单个参数校验失败
*
* @return
*/
@ExceptionHandler(ConstraintViolationException.class)
public HashMap<String, Object> validateHandler(ConstraintViolationException e) {
log.info(">>>>>>>>>>>>>>>>>>单个参数校验失败:{}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", e.getMessage());
StringBuilder errorInfo = new StringBuilder();
String errorMessage;
Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
for (ConstraintViolation<?> item : violations) {
errorInfo.append(item.getMessage()).append(",");
}
errorMessage = errorInfo.toString().substring(0, errorInfo.toString().length() - 1);
HashMap<String, Object> map = new HashMap<>(16);
map.put("code", 500);
map.put("msg", errorMessage);
return map;
}
}
- 处理结果
2. 单个参数验证
单个参数验证在controller上加上@Validated
package com.xhs.annotation.controller;
import com.xhs.annotation.request.UserRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.HashMap;
/**
1. @desc:
2. @author: xhs
3. @date: 2021/5/24 14:18
4. @version: JDK 1.8
*/
@Slf4j
@Validated
@RestController
public class UserController {
@PostMapping("/user")
public HashMap<String, Object> user(@RequestBody @Valid UserRequest userRequest) {
HashMap<String, Object> map = new HashMap<>(16);
map.put("code", 200);
map.put("msg", "处理成功");
map.put("data", userRequest);
return map;
}
@GetMapping("/getUser")
public HashMap<String, Object> getUser(@NotEmpty(message = "用户名不能为空") String name,
@NotEmpty(message = "密码不能为空") String pwd) {
HashMap<String, Object> map = new HashMap<>(16);
map.put("code", 200);
map.put("msg", "处理成功");
map.put("data", name);
return map;
}
}
- 处理结果:
3.常用注解
javax.validation.constraints 的注解和 org.hibernate.validator.constraints 的注解可以混用
- javax.validation.constraints 的注解
注解 | 使用 |
---|---|
@NotBlank | 只用来校验字符串不能为null,空格也是被允许的 。校验字符串推荐使用@NotEmpty |
@NotNull | 被注释的元素,值不能为null,但可以为"空",用于基本数据类型的非空校验上,而且被其标注的字段可以使用 @size、@Max、@Min 等对字段数值进行大小的控制 |
@NotEmpty | 用来校验字符串、集合、map、数组不能为null或空(字符串传入空格也不可以)(集合需至少包含一个元素) |
@Pattern(regexp = “”, message = “”) | 正则表达式匹配 |
@Size(min =, max =) | 指定的字符串、集合、map、数组长度必须在指定的max和min内允许元素为null,字符串允许为空格 |
@Min(value = long以内的值, message = “”) | 校验数字(包括integer short long int 等)的最小值,不支持小数即double和float允许元素为null |
@Max(value = long以内的值, message = “”) | 校验数字(包括integer short long int 等)的最小值,不支持小数即double和float允许元素为null |
@DecimalMin(value = 可以是小数, message = “”) | 被注释的元素,值必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value = 可以是小数, message = “”) | 被注释的元素,值必须是一个数字,其值必须小于等于指定的最大值 |
@Digits(integer =, fraction =) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@AssertTrue(message = “”) | 被注释的元素,值必须为true |
@AssertFalse | 被注释的元素,值必须为false |
@Email(regexp = “”, message = “”) | 被注释的元素必须是电子邮件地址 |
- org.hibernate.validator.constraints 的注解
注解 | 使用 |
---|---|
@Range(min =, max =, message = “”) | 被注释的元素必须在合适的范围内 |
@Length(min =, max =, message = “”) | 被注释的字符串的大小必须在指定的范围内 |