以前の記事を読んだ後は、注釈についてある程度理解している必要があり、作業で注釈を簡単に使用できるはずです。過去数日間、プロジェクトで検証の問題が発生しました。ちなみに、私はあなたと共有するための簡単なメモを書きました。
先に述べたように、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つの単語で書いています-実用的です!それがすべての人に役立つことを願っています。