美文网首页
3-5 “修改”和“删除” 请求——(校验)

3-5 “修改”和“删除” 请求——(校验)

作者: 唯有口袋里的钱能给我安全感 | 来源:发表于2018-05-17 10:12 被阅读6次

    常用的验证注解

    @Valid  被注释的元素是一个对象,需要检查此对象的所有字段值
    @Null   被注释的元素必须为 null
    @NotNull    被注释的元素必须不为 null
    @AssertTrue 被注释的元素必须为 true
    @AssertFalse    被注释的元素必须为 false
    @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @Size(max, min) 被注释的元素的大小必须在指定的范围内
    @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
    @Past   被注释的元素必须是一个过去的日期
    @Future 被注释的元素必须是一个将来的日期
    @Pattern(value) 被注释的元素必须符合指定的正则表达式
    

    更多注解参考:Hibernate Validator注解大全

    自定义消息

    原始消息:拼接式,即字段名+注解自带的消息提示

        @PutMapping("/user/{id:\\d+}")
        public User update(@PathVariable("id") String id,@Valid @RequestBody  User user, BindingResult errors){
            if (errors.hasErrors()){
                errors.getAllErrors().stream().forEach( error -> {
    //               FieldError fieldError = (FieldError)error;
    //              String message = fieldError.getField()+" "+error.getDefaultMessage();
    //              System.out.println(message);
                    System.out.println(error.getDefaultMessage());
                });
            }
            user.setId(id);
            user.setUsername(user.getUsername());
            return user;
        }
    

    效果如下图所示

    没自定义 message 时的效果

    自定义消息:给注解的 message 赋值,如下图:


    自定义 message

    自定义校验注解

    1. 定义一个注解

    自定义注解 @MyConstraint,在message()default "这是我自定义的校验注解"可以自定义消息,如果在使用注解的地方没有给 message 赋值的话,使用的默认消息就是这里的 default 的值

    package com.echo.security.validator;
    
    import javax.validation.Constraint;
    import javax.validation.Payload;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * @Author: yuju
     * @Date: 2018/5/16 - 18:06
     */
    @Target({ElementType.METHOD,ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME) //retention : 保留,保持
    @Constraint(validatedBy = MyConstraintValidator.class) //表示当前注解要用什么类来执行
    public @interface MyConstraint {
        String message() default "{javax.validation.constraints.Past.message}";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    
    1. 写注解的实现类

    自定义的类MyConstraintValidator实现了接口javax.validation.ConstraintValidator

    package com.echo.security.validator;
    
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    /**
     * @Author: yuju
     * @Date: 2018/5/16 - 18:12
     */
    public class MyConstraintValidator implements ConstraintValidator<MyConstraint,Object>{
        @Override
        public void initialize(MyConstraint constraintAnnotation) {
    
        }
    
        @Override
        public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
            System.out.println(o);
            return false;
        }
    }
    

    以下是javax.validation.ConstraintValidator的源码:,从ConstraintValidator的源码可以看出,实现该接口要实现一个方法isValid(),校验规则可以写在这个方法里。传入的泛型为注解MyConstraintObject,表示这个注解可以用于所有类型(object)上

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package javax.validation;
    
    import java.lang.annotation.Annotation;
    
    public interface ConstraintValidator<A extends Annotation, T> {
        default void initialize(A constraintAnnotation) {
        }
    
        boolean isValid(T var1, ConstraintValidatorContext var2);
    }
    
    自定义注解的使用

    相关文章

      网友评论

          本文标题:3-5 “修改”和“删除” 请求——(校验)

          本文链接:https://www.haomeiwen.com/subject/zucmdftx.html