验证 DTO 中的整数字段

Posted

技术标签:

【中文标题】验证 DTO 中的整数字段【英文标题】:Validating integer field in DTO 【发布时间】:2021-06-29 05:18:15 【问题描述】:

我的 Spring Boot 应用程序具有以下 DTO 请求:

public class MyAwesomeDTO 

    @NotNull
    private Integer itemCount;

我希望 itemCount 为 0 或在 [3, 10] 范围内 .后者可以通过@Min(3) @Max(10) 进行验证,但是如何验证“OR”条件呢?

【问题讨论】:

【参考方案1】:

itemCount0null 之间存在差异。 @NotNull 只防范 null,而不是 0

完成您需要的最简单的方法是编写自定义验证器。

首先创建一个自定义注解来触发验证:

@Target(  ElementType.METHOD, ElementType.FIELD )
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ItemCountValidator.class)
public @interface ValidItemCount 
    String message() default "Invalid item count";
    Class<?>[] groups() default ;
    Class<? extends Payload>[] payload() default ;

接下来,创建自定义验证器:

public class ItemCountValidator implements 
  ConstraintValidator<ValidItemCount, Integer> 

    @Override
    public void initialize(ValidItemCount validItemCount) 
    

    @Override
    public boolean isValid(Integer itemCount,
      ConstraintValidatorContext cxt) 
        return itemCount != null && (itemCount == 0 || itemCount > 3 && itemCount < 10);
    


最后,更新你的 DTO:

public class MyAwesomeDTO 

    @ValidItemCount
    private Integer itemCount;

【讨论】:

以上是关于验证 DTO 中的整数字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dto 验证 nestjs 中的对象数组

根据 DTO、实体模型或其他东西验证服务层中的数据?

服务或控制器中的 Spring DTO 验证?

[Abp 源码分析]DTO 自动验证

Spring Rest API 验证应该在 DTO 中还是在实体中?

Spring Boot实现用户注册验证全过程