diff --git a/doc/validation.md b/doc/validation.md new file mode 100644 index 0000000000000000000000000000000000000000..52e2dd95ca34d645831370ad6ae6b8eff1a31530 --- /dev/null +++ b/doc/validation.md @@ -0,0 +1,253 @@ +###1.后端如何使用注解优雅的进行参数校验 +####1.1 常用注解 + + @Null(message = "XXXX不能为空") 被注释的元素必须为 null, message尽量要写不然前端不知道是哪个字段 + + @NotNull(message = "XXXX不能为空") 被注释的元素必须不为 null, message尽量要写不然前端不知道是哪个字段 + + @Length 被注释的字符串的大小必须在指定的范围内,注意只能用在String上 否则会报错, message尽量要写不然前端不知道是哪个字段 + + @NotEmpty 被注释的字符串的必须非空,注意只能用在String上 否则会报错, message尽量要写不然前端不知道是哪个字段 + + @AssertTrue(message = "XXXX") 被注释的元素必须为 true, message尽量要写不然前端不知道是哪个字段 + + @AssertFalse 被注释的元素必须为 false + + @Min(value=L,message="XXXX") 被注释的元素必须是一个数字,其值必须大于等于指定的最小值, message尽量要写不然前端不知道是哪个字段 + + @Max(value=L,message="XXXX") 被注释的元素必须是一个数字,其值必须小于等于指定的最小值, message尽量要写不然前端不知道是哪个字段 + + @DecimalMin(value=L,message="XXXX") 被注释的元素必须是一个数字,其值必须大于等于指定的最小值, message尽量要写不然前端不知道是哪个字段 + + @DecimalMax(value=L,message="XXXX") 被注释的元素必须是一个数字,其值必须小于等于指定的最大值, message尽量要写不然前端不知道是哪个字段 + + @Size(max, min) 被注释的元素的大小必须在指定的范围内, message尽量要写不然前端不知道是哪个字段 + + @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内, message尽量要写不然前端不知道是哪个字段 + + @Past 被注释的元素必须是一个过去的日期, message尽量要写不然前端不知道是哪个字段 + + @Future 被注释的元素必须是一个将来的日期, message尽量要写不然前端不知道是哪个字段 + + @Pattern(value) 被注释的元素必须符合指定的正则表达式, message尽量要写不然前端不知道是哪个字段 + + @Email 被注释的元素必须是电子邮箱地址, message尽量要写不然前端不知道是哪个字段 + + @Range 被注释的元素必须在合适的范围内, message尽量要写不然前端不知道是哪个字段 + + @NotBlank 验证字符串非null,且长度必须大于0,注意只能用在String上 否则会报错 + +然后需要在controller方法体添加@Validated 或 @Valid 不加校验会不起作用 +![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/165424_ce989231_2351834.png "屏幕截图.png") +####1.2 例子 +![输入图片说明](https://images.gitee.com/uploads/images/2021/0716/165100_f3ce1dee_2351834.png "屏幕截图.png") +####1.3 如何扩展(如何自定义校验注解) +(1)定义注解,必须包含message、groups、Payload三个属性 +```java +/** + * 边界值校验 + * @author Lilu + * @date 2021-7-16 16:57 + */ + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = { IntegerValidImpl.class}) +public @interface IntegerValid { + + int max();//最大值 + + int min();//最小值 + + String message() default "{你不对劲}"; + + Class[] groups() default { }; + + Class[] payload() default { }; + +} +``` +(1)实现接口 +```java +import org.springframework.stereotype.Component; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * @author Lilu + * @date 2021-7-16 16:57 + */ +/** + * 自定义类,用于对校验注解规则的实现 + * 实现 ConstraintValidator 接口,泛型,第一个是对什么注解进行实现,第二个是检验的数据的数据类型 ; + */ +@Component +public class IntegerValidImpl implements ConstraintValidator { + + private int min; + private int max; + + /** + * @Description 初始化 + * @Date 2021-7-16 17:09 + * @Param [constraintAnnotation] + * @return void + **/ + @Override + public void initialize(IntegerValid constraintAnnotation) { + min=constraintAnnotation.min(); + max=constraintAnnotation.max(); + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + System.out.println(value); + if(value>min&&value