Javaアノテーションチャット-カスタムパラメータ検証アノテーション

以前の記事を読んだ後は、注釈についてある程度理解している必要があり、作業で注釈を簡単に使用できるはずです。過去数日間、プロジェクトで検証の問題が発生しました。ちなみに、私はあなたと共有するための簡単なメモを書きました。

先に述べたように、Springフレームワークのコントローラーでは、誰もがアノテーションを使用してjsonパラメーターを受け取り、パラメーターには通常@NotNullなどのアノテーションが付けられるため、パラメーターはメソッドに入るときに検証されます。

関連するjarパッケージにカプセル化された多くの検証ルールがあり、基本的にほとんどの検証に使用できます。しかし、突然拡大したい場合はどうすればよいですか?心配しないでください。これらの検証メカニズムには、Spring Frameworkのようにユーザーが拡張できるインターフェースがあり、多くの実装はそれ自体で実装できます。

IDカード番号の確認を実装しましょう。

最初にコメントを定義します。書き込み方法はこのモードです。他の人の検証コードを使用したい場合は、当然、元の作成者のルールに準拠します。

package com.example.demoproject.valid;

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;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ConstraintImpl.class)
public @interface ValidIDCard {
    String message();
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

アノテーション検証を実装するには、インターフェースConstraintValidatorを実装する必要があります。コードは次のとおりです。

 

package com.example.demoproject.valid;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

public class ConstraintImpl implements ConstraintValidator<ValidIDCard,Object> {

    private static final String IDCard18 = "[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]";
    private static final String IDCard15 = "[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}";

    @Override
    public void initialize(ValidIDCard constraintAnnotation) {
        // 获取注解值中的value,如果有需要的话可以进行处理,比如Max,Min 就需要
        System.out.println("校验身份证号初始化~~~");
    }

    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        Pattern pattern ;
        if(o instanceof  String){
            String str = (String)o;
            if(str.length()==18){
                pattern = Pattern.compile(IDCard18);
                return pattern.matcher(str).matches();
            }
            if(str.length()==15){
                pattern = Pattern.compile(IDCard15);
                return pattern.matcher(str).matches();
            }
        }
        return false;
    }
}

このようにして、メソッドで定期的なチェックが実現されます。さて、メソッドテストを書いてみましょう。

オブジェクトを作成する

package com.example.demoproject.dto;

import com.example.demoproject.valid.ValidIDCard;
import lombok.Data;

import javax.validation.constraints.NotNull;

@Data
public class ValidDTO {

    @NotNull(message = "名称不能为空")
    String name;

    @ValidIDCard(message = "身份证号格式不对~")
    String idCard;

    String age;

}

以下にメソッドテストを記述します。

    @PostMapping(value = "test-valid")
    public String testValid(@RequestBody @Valid ValidDTO validDTO){

        return JSON.toJSONString(validDTO);
    }

リクエストパラメータのID番号が規則性と一致しない場合、エラーが自然に報告されます。このエラーはキャプチャおよび処理されず、直接投稿されました〜

 "errors": [
        {
            "codes": [
                "ValidIDCard.validDTO.idCard",
                "ValidIDCard.idCard",
                "ValidIDCard.java.lang.String",
                "ValidIDCard"
            ],
            "arguments": [
                {
                    "codes": [
                        "validDTO.idCard",
                        "idCard"
                    ],
                    "arguments": null,
                    "defaultMessage": "idCard",
                    "code": "idCard"
                }
            ],
            "defaultMessage": "身份证号格式不对~",
            "objectName": "validDTO",
            "field": "idCard",
            "rejectedValue": "341282199175",
            "bindingFailure": false,
            "code": "ValidIDCard"
        }
    ],

 

詳細については何も言いません。今日、私はこれを主に2つの単語で書いています-実用的です!それがすべての人に役立つことを願っています。

                       

犠牲も勝利もありません!!!

おすすめ

転載: blog.csdn.net/zsah2011/article/details/106677913