注解校验
自定义注解
申明注解
package com.wpc.springbootdynamicsourceswtich.validate;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @ClassName EnumValidate
* @Description TODO
* @Author wpc
* @Date 2023/3/27 10:20
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidateValidator.class})
public @interface EnumValidate {
String[] strValue() default "";
String message() default "枚举值传入错误";
boolean required() default false;
Class<?> [] groups() default {};
Class<? extends Payload> [] payload() default {};
}
自定义校验
package com.wpc.springbootdynamicsourceswtich.validate;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* @ClassName EnumValidateValidator
* @Description TODO
* @Author wpc
* @Date 2023/3/27 10:23
*/
public class EnumValidateValidator implements ConstraintValidator<EnumValidate, Object> {
private boolean required;
private String[] values;
@Override
public void initialize(EnumValidate constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
required = constraintAnnotation.required();
this.values = constraintAnnotation.strValue();
}
@Override
public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
//非必传
if (!required && o == null) {
return true;
}
//必传为null直接返回
if (o == null) {
return false;
}
try {
if (values != null ) {
for (String value : values) {
if (value.equals(o)) {
return true;
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException("枚举类型验证错误");
}
return false;
}
}
@NotBlank、@NotEmpty、@NotNull区别
- @NotNull:主要用在基本数据类型上(int,Integer,Double),不能为null,但是可以是空字符串
- @NotEmpty:主要用在集合类上,不能为空,而且长度必须大于0(" "," ");
- @NotBlank:用在字符串上
注解不生效的原因
-
实体类上必须要添加@Valid注解去校验
-
添加校验注解后还未生效可能是需要添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.7.12</version> </dependency>
获得校验的结果
- 在实体类后面添加 BindingResult result
controller层统一处理
@Slf4j
@RestControllerAdvice("xxx")
public class ExecptionControllerAdvice {
/**
* 参数非法(效验参数)异常 MethodArgumentNotValidException
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public R handleValidException(MethodArgumentNotValidException e) {
log.error("数据效验出现问题{},异常类型{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
Map<String,String> errMap = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError) -> {
errMap.put(fieldError.getField(),fieldError.getDefaultMessage());
});
return R.error(BizCodeEnum.VAILD_EXCEPTION.getCode(),BizCodeEnum.VAILD_EXCEPTION.getMessage())
.put("data",errMap);
}
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable) {
log.error("错误异常{}",throwable);
return R.error(BizCodeEnum.UNKNOW_EXCEPTION.getCode(),BizCodeEnum.UNKNOW_EXCEPTION.getMessage());
}
}
分组校验
添加分组接口AddGroup、UpdateGroup
public interface AddGroup {
}
public interface UpdateGroup {
}
注解指定分组
@NotBlank(groups = {AddGroup.class})
controller添加@Validated(AddGroup.class)
使用指定分组后未添加分组的校验不生效