实体类字段加入注解javax.validation validation-api 2.0.1.Final org.hibernate.validator hibernate-validator 6.2.0.Final
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Null; import javax.validation.constraints.Pattern;
@ApiModelProperty(value = "菜单名称")
@NotBlank(groups = {Insert.class, Update.class},message = "菜单名称不能为空")
@Length(min = 1, max = 20, message = "菜单名称长度不能超过20", groups = {Insert.class, Update.class})
@Pattern(regexp = "^[\u4E00-\u9FA5A-Za-z0-9_]+$", message = "菜单名称不支持特殊字符", groups = {Insert.class, Update.class})
private String name;
controller加入注解@Validated
@ApiOperation("增加-返回id")
@PostMapping("/add")
@CommonValidata
public ApiResponse add(@RequestBody @Validated({Insert.class}) Component vo, BindingResult bindingResult) {
Long result = baseService.addOne(vo);
return ApiResponse.of(result);
}
@Validated({Insert.class})其中的Insert.class是校验组,与groups = {Insert.class, Update.class}对应,表示只进行校验Insert.class的这个组。
BindingResultcontroller中BindingResult bindingResult这个参数是viladator校验好的结果对象
1.当这个参数不存在时,如果校验失败,spring boot会自动返回错误信息。
2.这个参数存在时,不会自动返回错误信息,而是将错误信息绑定在bindingResult对象中,开发人员可以自定义自己的错误信息。
import java.lang.annotation.*;
@Target({ElementType.METHOD , ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface CommonValidata {
Class>[] validator() default {};
}
切面类
这里通过切面形式,对加入了@CommonValidata注解的请求进行环绕增强。拦截bindingResult,抛出自定义异常,再通过全局异常捕获将错误信息返回给前端。
import org.apache.commons.collections4.CollectionUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import java.util.List;
@Component
@Aspect
public class CommonValidator {
@Pointcut("@annotation(com.***.***.***.annotation.CommonValidata)")
public void validatorPointCut() {
}
@Around("validatorPointCut() && args(..,bindingResult)")
public Object validateParam(ProceedingJoinPoint pjp,BindingResult bindingResult) throws Throwable {
List fieldErrors = bindingResult.getFieldErrors();
if(CollectionUtils.isNotEmpty(fieldErrors)){
FieldError fieldError = fieldErrors.get(0);
AppCode.CLIENT_ERROR.throwThis(fieldError.getDefaultMessage());
}
Object proceed = pjp.proceed();
return proceed;
}
}
切入点
controller方法上加入@CommonValidata即可
@ApiOperation("增加-返回id")
@PostMapping("/add")
@CommonValidata
public ApiResponse add(@RequestBody @Validated({Insert.class}) Component vo, BindingResult bindingResult) {
Long result = baseService.addOne(vo);
return ApiResponse.of(result);
}



