一、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 |
| 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@Range(min=最小值, max=最大值) |
| 验证注解的元素值在最小值和最大值之间 |
@NotBlank |
| 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
@Length(min=下限, max=上限) |
| 验证注解的元素值长度在min和max区间内 |
|
| 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
参考地址:
https://www.cnblogs.com/moues/p/11399421.html