@Validと@Validatedの違いと詳しい使い方とパラメータアノテーションの検証

1. @Validated と @Valid の違い

このアノテーションをコントローラに追加する必要があります。追加しないと、検証アノテーションが有効になりません。

グループ

@Validated: パラメータ検証を入力する際に​​、異なるグループに応じて異なる検証メカニズムを採用できるグループ化機能を提供します。グループ化属性が追加されていない場合、デフォルトの検証にはグループ化検証属性がありません。 @Valid: 標準の JSR-303 仕様として、
また基を吸収する機能もありません

位置

@Validated: 型、メソッド、メソッド パラメーターで使用できます。ただし、メンバー プロパティ (フィールド) では使用できません。メンバー プロパティに @Validated の注釈が付けられている場合、フィールド エラーには適用されないことが報告されます。@Valid: は、メソッド、コンストラクター、メソッド パラメーター、およびメンバー プロパティで使用できます
(フィールド)、両方 後者をメンバー属性 (フィールド) で使用できるかどうかは、ネストされた検証関数を提供できるかどうかに直接影響します。

在接口使用注解进行校验,在类上添加注解:@Validated

ネストされた検証

@Validated: メソッド入力パラメーターで使用する場合、ネストされた検証関数を単独で提供することはできず、メンバー属性 (フィールド) にも使用できません。また、ネストされた検証を実行するようにフレームワークに指示することもできません。ネストされた検証アノテーション @Valid と連携できます。ネストされた検証を実行します。
@Valid: メソッドの入力パラメーターで使用すると、ネストされた検証関数を単独で提供することはできませんが、メンバー属性 (フィールド) で使用でき、検証フレームワークにネストされた検証を実行するよう促し、ネストされた検証アノテーション @Valid と連携して実行することができます。ネストされた検証

1. グループ分けの例

グループ化インターフェイスの定義

public interface IGroupA {
    
    
}

public interface IGroupB {
    
    
}

検証パラメータBeanを定義する

public class StudentBean{
    
    
   //只在分组为IGroupB的情况下进行验证
   @Min(value = 18, message = "年龄不能小于18岁", groups = {
    
    IGroupB.class})
}

コントローラ層

@RestController
public class CheckController {
    
    
    @PostMapping("stuA")
    public String addStuA(@Validated({
    
    IGroupA.class}) @RequestBody StudentBean studentBean){
    
    
        return "add studentA success";
    }
    
    @PostMapping("stuB")
    public String addStuB(@Validated({
    
    IGroupB.class}) @RequestBody StudentBean studentBean){
    
    
        return "add studentB success";
    }
}
同时调用两个方法,传入参数为age=15
addStuA方法结果为:age:15 add studentA success
addStuA方法结果为:age:年龄不能小于18

知らせ!

グループを割り当てていない場合は毎回検証が必要
パラメータに複数の検証方法が必要な場合、異なるグループを割り当てることが可能

2. グループシーケンス

デフォルトでは、さまざまなレベルの制約検証は順序付けされていませんが、場合によっては順序検証が非常に重要です。グループは
他のグループのシーケンスとして定義でき、検証に使用する場合はシーケンスで指定された順序に準拠する必要があります。
グループシーケンスの検証時に、シーケンスの先頭のグループの検証が失敗した場合、後続のグループは検証されなくなります。

例: グループシーケンスの定義

@GroupSequence({
    
    Default.class, IGroupA.class, IGroupB.class})
public interface IGroup {
    
    
}

検証する必要がある Bean について、年齢を検証するための IGroupA と電子メールを検証するための IGroupB をそれぞれ定義します。

public class StudentBean implements Serializable {
    
    

   @NotBlank(message = "用户名不能为空")
   private String name;

   //只在分组为IGroupB的情况下进行验证
   @Min(value = 18, message = "年龄不能小于18岁", groups = {
    
    IGroupA.class})
   private Integer age;

   @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
   private String phoneNum;

   @Email(message = "邮箱格式错误", groups = {
    
    IGroupB.class})
   private String email;
}

テストコード:

@RestController
public class CheckController {
    
    
   @PostMapping("stu")
   public String addStu(@RequestBody @Validated({
    
    IGroup.class}) StudentBean studentBean){
    
    
      return "add student success";
   }
}

テスト結果: IGroupA で定義されたエラーのみがチェックされ、IGroupB はチェックされません

3. ネストされた検証

検証対象の pojo クラス。検証対象のオブジェクトも含まれています。検証対象のオブジェクトのメンバー属性を検証するには、検証対象のオブジェクトに @Valid アノテーションを付ける必要があります。ここでは @Validated は使用できません

例: 制約検証用の Bean

public class TeacherBean {
    
    
   @NotEmpty(message = "老师姓名不能为空")
   private String teacherName;
   @Min(value = 1, message = "学科类型从1开始计算")
   private int type;
}

public class StudentBean implements Serializable {
    
    

   @NotBlank(message = "用户名不能为空")
   private String name;

   //只在分组为IGroupB的情况下进行验证
   @Min(value = 18, message = "年龄不能小于18岁", groups = {
    
    IGroupA.class})
   private Integer age;

   @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
   private String phoneNum;

   @Email(message = "邮箱格式错误", groups = {
    
    IGroupB.class})
   private String email;

   @NotNull(message = "任课老师不能为空")
   @Size(min = 1, message = "至少有一个老师")
   private List<TeacherBean> teacherBeanList;
}

注: ここでは、TeacherBeans については NotNull と Size のみがチェックされ、教師情報のフィールドはチェックされていません。教師の型は
制約要件を満たしていませんが、テストで行われていないため、テストに合格できます。学生。ネストされた検証。
TeacherBeans に @Valid を追加できます

@Valid
@NotNull(message = "任课老师不能为空")
@Size(min = 1, message = "至少有一个老师")
private List<TeacherBean> teacherBeanList;

この場合、TeacherBean 内のパラメータが検証されます。

2. 検証メモ

//适用于基本数据类型(Integer,Long,Double等等),当 @Null,@NotNull 注解被使用在 String 类型的数据上,则表示该数据(不)能为 Null(但是可以为 Empty)
//必须为null
@Null
//不能为null
@NotNull

//只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@NotBlank
//适用于 String、Collection集合、Map、数组等等,不能为null,并且长度必须大于0
@NotEmpty

//用于boolean字段,必须为true
@AssertTrue
//用于boolean字段,必须为false
@AssertFalse

//必须为数字,其最小值必须大于等于指定的值
@Min(value)  eg: @Min(100) or @Min(value = 100, message = "最小值为100")
//必须为数字,其最大值必须小于等于指定的值
@Max(value)

//支持Decimal, 只能大于或等于该值
@DecimalMin(value)
//支持Decimal, 只能小于或等于该值
@DecimalMax(value)

//数字必须在范围内
@Range  eg:@Range(min =1 ,max = 100, message = "范围为1-100")
//大小必须在范围内
@Size eg:@Size(min=5, max=10, message="字符串或数组的长度必须在5-10之间")

//校验小数,小数点前支持多少位,小数点后支持多少位
@Digits(integer=6,fraction=2, message="小数点前支持6位,小数点后支持2位")

//必须是一个过去的日期
@Past
//必须是一个将来的日期
@Future

//必须符合指定的正则表达式
@Pattern(value)

//必须是电子邮件地址
@Email

//字符创长度必须在规定范围内,只能用于字符串
@Length(min=,max=)

//字符串非空
@NotEmpty

//对信用卡号进行一个大致的验证
@CreditCardNumber

//检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件
@URL(protocol=,host,port)

おすすめ

転載: blog.csdn.net/weixin_45265547/article/details/126296607