- SpringBoot版本
- 高于2.3.+,需要手动引入Hibernate-Validator依赖坐标
- 低于2.3.+,SpringBoot已经自动引入相关依赖,无需引入
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-validatorartifactId>
<version>6.0.1.Finalversion>
dependency>
SpringBoot集成
自定义参数异常类
public class ParameterCheckFailedException extends RuntimeException {
public ParameterCheckFailedException(String message) {
super(message);
}
@Override
public String getMessage() {
return super.getMessage();
}
}
参数校验工具类
public class ValidationUtils {
private static final Validator VALIDATOR_RESOLVER = Validation.buildDefaultValidatorFactory().getValidator();
/**
* @param obj 实体类参数
* @param clazz 分组
* @param 实体类参数类型
* @return ValidationResult 结果集
*/
public static <T> ValidationResult validateEntity(T obj, Class<?>... clazz) {
ValidationResult result = new ValidationResult();
Set<ConstraintViolation<T>> set = VALIDATOR_RESOLVER.validate(obj, clazz);
if (CollectionUtils.isNotEmpty(set)) {
result.setErrorMessages(set.stream().map(ConstraintViolation::getMessage).collect(Collectors.toList()));
}
return result;
}
}
参数校验结果实体类
@Data
public class ValidationResult {
/**
* 参数校验错误描述
*/
private List<String> errorMessages;
/**
* 是否存在错误
*
* @return true错误 false成功
*/
public Boolean hasErrors() {
return CollectionUtils.isNotEmpty(this.errorMessages);
}
}
拦截器
对控制层Controller所有请求方法的参数进行拦截,对使用Hibernate校验注解的参数进行校验
@Component
@Slf4j
@Aspect
public class ControllerAspectInterceptor {
/**
* 定义切入点
* controller所有的方法均会拦截
*/
@Pointcut("execution(* com.oaein..controller.*.*(..))")
public void controllerPointcut() {
}
@Around("controllerPointcut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
Object[] args = point.getArgs();
if (args != null) {
for (Object arg : args) {
if (arg != null) {
if (arg instanceof ServletRequest
|| arg instanceof ServletResponse
|| arg instanceof MultipartRequest
|| arg instanceof MultipartFile) {
// 排除特殊的参数校验
continue;
}
log.info("==> {} - 【入参】:{}", HttpUtils.getRequestUrl(), JSON.toJSONString(args));
// 参数校验
ValidationResult validationResult = ValidationUtils.validateEntity(arg);
if (validationResult.hasErrors()) {
throw new ParameterCheckFailedException(validationResult.getErrorMessages().toString());
}
}
}
}
return point.proceed();
}
}
全局异常拦截
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 请求参数异常处理
*
* @param ex ParameterCheckFailedException
* @return {@link Result}
*/
@ExceptionHandler(ParameterCheckFailedException.class)
public Result exceptionHandler(ParameterCheckFailedException ex) {
log.error("×××××【请求参数异常】:{}", ex.getMessage());
return Result.fail("请求参数出错:" + ex.getMessage());
}
}
注解 | 描述 |
---|---|
@NotNull | 元素必须不能为null |
@NotEmpty | 标注的字符串必须非空 |
@Min(value) | 必须是一个数字,其值>=value |
@Max(value) | 必须是一个数字,其值<=value |
@DecimalMin(value) | 必须是一个数字,其值必须>=value |
@DecimalMax(value) | 必须是一个数字,其值必须<=value |
@Size(max,min) | 大小必须在其区间内,用于集合 |
@Digits(integer,faction) | 其值必须在这区间内 |
@Past | 过去的日期 |
@Future | 将来的日期 |
@Pattern | 正则表达式 |
@Length(min=,max=) | 字符串长度 |
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)