| 注解 | 释义 |
|---|---|
| @Null | 必须为null |
| @NotNull | 不能为null |
| @AssertTrue | 必须为true |
| @AssertFalse | 必须为false |
| @Min | 必须为数字,其值大于或等于指定的最小值 |
| @Max | 必须为数字,其值小于或等于指定的最大值 |
| @DecimalMin | 必须为数字,其值大于或等于指定的最小值 |
| @DecimalMax | 必须为数字,其值小于或等于指定的最大值 |
| @Size | 集合的长度必须在指定范围内 |
| @Digits | 必须为数字,其值必须再可接受的范围内 |
| @Past | 必须是过去的日期 |
| @Future | 必须是将来的日期 |
| @Pattern(regex = , flag = ) | 必须符合正则表达式 |
| 必须是邮箱格式 | |
| @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
本文详细介绍HibernateValidator中常用的注解及其用途,包括@Null、@NotNull等,并提供了配置类和异常处理的示例代码,帮助读者理解如何在项目中应用这些注解进行数据验证。
2216

被折叠的 条评论
为什么被折叠?



