Javaでのパラメータ検証(Spring版以外)

6037 ワード

1.Javaでのパラメータ検証(Spring版以外)
1.1. 前言
  • なぜ私はいつもこのような非正常な問題に直面しているのか、私たちは多くの場合、私たちのパラメータ検査はcontroller層の伝達パラメータに置いて検査を行うことを知っています.私たちがよく使う検査方法は以下のjarパッケージを導入し、パラメータに@Validatedを追加し、Bean対象のパラメータに対して異なる注釈処理をすればいいのです.Springという一般的なやり方はよく知っているはずです.
  • しかし、私が今直面している需要は、bossが汎用性を追求しているため、私たちのcontroller入口は1つしかありません.パラメータの異なるtradeCodeを入力することで、どのサービスを呼び出すかを区別します.このとき、私はパラメータを検証して具体的な各サービス方法に置かなければなりません.このように私のテストを経て、この注釈を加えることはもう役に立ちません.
  •     
        
            javax.validation
            validation-api
            1.1.0.Final
        
        @PostMapping("/save/valid")
        public RspDTO save(@RequestBody @Validated UserDTO userDTO) {
            userService.save(userDTO);
            return RspDTO.success();
        }
    @Data
    public class UserDTO implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        /***   ID*/
        @NotNull(message = "  id    ")
        private Long userId;
        
        /**    */
        @NotBlank(message = "       ")
        @Length(max = 20, message = "       20   ")
        @Pattern(regexp = "^[\\u4E00-\\u9FA5A-Za-z0-9\\*]*$", message = "      :  20  ,    、     ")
        private String username;
        
        /**    */
        @NotBlank(message = "       ")
        @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "       ")
        private String mobile;
    
        /**  */
        private String sex;
    
        /**   */
        @NotBlank(message = "        ")
        @Email(message = "      ")
        private String email;
    
        /**   */
        private String password;
    
        /***      */
        @Future(message = "         ")
        private Date createTime;
    
    }

    1.2. イニシアチブ
  • はその注釈を使うことができませんが、私たちはその方法を使うことができます.以下、Javaコードでパラメータを検証する例を書きました.レンガを投げて玉を引くことはできません.自分のシステムで直接使うことはできません.自分のシステムのパッケージ方法と結びつけて、注釈の形式を作るつもりです.spring aopを利用して私のサービス層を切ります.達成された効果はcontroller層と類似している
  • 1.2.1.主な方法
    import org.springframework.validation.annotation.Validated;
    
    import javax.validation.ConstraintViolation;
    import javax.validation.Validation;
    import javax.validation.Validator;
    import javax.validation.ValidatorFactory;
    import java.util.Date;
    import java.util.Set;
    import java.util.stream.Stream;
    
    /**
     * @author laoliangliang
     * @date 2019/10/22 15:19
     */
    public class ValidLearn {
        public static void main(String[] args) {
            ValidLearn learn = new ValidLearn();
            learn.testValid(new Order().setIdcard("33062119981012361X").setName("  ").setCreateDate(new Date()));
        }
    
        public void testValid(@Validated Order order) {
            ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
            Validator validator = validatorFactory.getValidator();
            //  Insert.class id     
            Set> validate = validator.validate(order, Insert.class);
            Stream.of(validate).forEach(action -> {
                for (ConstraintViolation orderConstraintViolation : action) {
                    String message = orderConstraintViolation.getMessage();
                    System.out.println(message);
                }
            });
        }
    }

    1.2.2.エンティティークラス
    /**
     * @author laoliangliang
     * @date 2019/10/21 16:44
     */
    @Data
    @Accessors(chain = true)
    public class Order {
    
        @NotNull(message = "id    ",groups = Update.class)
        private Long id;
    
        @NotEmpty(message = "name is not null",groups = Insert.class)
        private String name;
    
        @Future(message = "       ")
        private Date createDate;
    
        @IdCardValid(message = "idcard    ")
        private String idcard;
    }
  • 以上の2つのコードは実体クラスオブジェクトの注釈を検証し、検証が通過しないメッセージを印刷することができ、検証エラーメッセージがある場合に異常
  • を投げ出すように改造することができる.
  • コードは、groupパケットおよびカスタム注釈
  • などの詳細にも関連する.
    1.2.3.グループ
    import javax.validation.groups.Default;
    
    /**
     * @author laoliangliang
     * @date 2019/10/22 16:32
     */
    public interface Update extends Default {
    }
    import javax.validation.groups.Default;
    
    /**
     * @author laoliangliang
     * @date 2019/10/22 16:32
     */
    public interface Insert extends Default {
    }
    
  • 私の例コードにはInsert.classが使用されています.挿入動作をすると、このパケットが存在する注釈が機能することを示しています.そのため、私はidを伝えず、idが空でない注釈も
  • には機能しません.
    1.2.4.カスタム注記
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * @author laoliangliang
     * @date 2019/10/22 15:55
     */
    public class IdCardValidator implements ConstraintValidator {
    
        private Pattern pattern = Pattern.compile("^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])" +
                "\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$");
        @Override
        public void initialize(IdCardValid idCardValid) {
        }
    
        @Override
        public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
            Matcher matcher = pattern.matcher(o.toString());
            return matcher.matches();
        }
    }
    /**
     * @author laoliangliang
     * @date 2019/10/22 15:53
     */
    @Documented
    @Target({ElementType.PARAMETER,ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = IdCardValidator.class)
    public @interface IdCardValid {
    
        String message() default "      ";
    
        Class>[] groups() default {};
    
        Class extends Payload>[] payload() default {};
    }
  • ここで私は身分証明書番号を検証することを例に、ConstraintValidatorインタフェースを実現するカスタム注釈を書いて、isValid方法の中でカスタムロジックを実現して注釈
  • を使用することができます.
    1.3. まとめ
  • この記事では、ValidationがJavaコードで検証を実現する例を挙げ、service層パラメータ検証に対応し、実際に自分のコードに適用して自分でカスタム注釈を書くことができ、aop接面を実現し、接面の中で検証を行う
  • コレクションの作者の知識点の整理を訪問することを歓迎して、登録していないのはここをクリックしてください