<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.6.6</version>
</dependency>
@NotEmpty@NotBlank@URL(message = "logo必须是一个合法的url地址")@Pattern(regexp = "/^[a-zA-Z]$/", message = "检索首字母必须是一个字母")@Min(value = 0, message = "排序必须大于等于0")但如果出现以下问题:
比如相同的Entity, 插入的时候这个字段必须为空, 修改的时候就不能为空, 就很难办了. 例如修改商品时候商品的id.
解决办法:
先自定义两个空接口, 一个是表示增加的接口AddGroup, 一个表示修改的接口UpdateGroup
把@Valid换成@Validated({xxxGroup.class})
然后在Entity中每个使用校验的地方后面加个groups = {xxxGroup.class}
如果不写默认不参加校验
@Documented
@Constraint(
validatedBy = { ListValueConstraintValidator.class }
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
String message() default "{com.haozhancc.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] vals() default { };
}
@Slf4j
@RestControllerAdvice(basePackages = "com.haozhancc.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleVaildException(MethodArgumentNotValidException e) {
log.error("数据校验出现问题{}, 异常类型: {}", e.getMessage(), e.getClass());
BindingResult bindingResult = e.getBindingResult();
Map<String, String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError -> {
errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
}));
return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(), BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data", errorMap);
}
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable) {
log.error("错误: ", throwable);
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(), BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
}
@Constraint(
validatedBy = { ListValueConstraintValidator.class }
)