当前位置: 首页 > 知识库问答 >
问题:

DTO级别上基于注释的验证发生在字段级别验证之前,比如@Notnull@size等

艾飞宇
2023-03-14

我有一个DTO类,我在其中设置了一些强制字段。并且,基于另一个类型字段,其中值可以假设A和B,如果类型A,则需要检查只有1项可以传递,如果B,它也可以大于1。

我需要检查一个列表在DTO类级别中是否至少有1个值。并且,在自定义批注验证中,我需要根据DTO的类型字段检查列表的大小。

所以,在DTO中

@NotNull
@Size(min = 1)
private List<@NotBlank String> items;

并且,在注释内

        if (cancelType == CancellationTypeEnum.A && cancelDto.getItems().size() > 1) {

            isValid = false;
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate(
                    "Only one item can be sent for 'A' cancel type.").addConstraintViolation();

        } 

但是,由于字段级别发生在后面,如果我为items字段传递null,它将转到这个注释验证器&当字段为null时抛出NPE&我正在尝试获取大小

临时的解决方案是我做空检查,然后检查大小,但在字段级别,我们无论如何都给@NotNull。

共有1个答案

凤晨朗
2023-03-14

您可以使用JS-303验证组(请参见此处),并结合@validated使用文档:

JSR-303的Valid的变体,支持验证组的规范。

例如:

@CheckEnumSize(groups = {Secondary.class})
public class CancelDto {

    public CancelDto(List<String> items) {
        this.items = items;
    }

    @NotNull(groups = {Primary.class})
    @Size(min = 1)
    public List<@NotNull String> items;

    public CancellationTypeEnum cancelType;

    public List<String> getItems() {
        return items;
    }
}
 
public interface Primary {
}
public interface Secondary {
}
@Service
@Validated({Primary.class, Secondary.class})
public class CancelService {

    public void applyCancel(@Valid CancelDto cancel) {
        //TODO
    }

}
Caused by: javax.validation.ConstraintViolationException: applyCancel.cancel.items: must not be null
 类似资料:
  • 我有以下问题,有一个常规的spring模型(我们称之为“a”),带有一些与验证相关的注释。接下来是一个命令对象(定义一些字段的常规POJO类,其中一个是类型a的对象)。command对象实现了Validator接口,以使绑定和验证在控制器方法中工作。 问题是,如何在命令对象内部使用注释配置的验证(因为它实现了Validator接口,所以它有supports()和validate()方法)。 我试图

  • 问题内容: 有没有一种方法可以使用此处定义的注释来定义Hibernate验证规则,说明至少一个字段不能为null? 这将是一个假设的示例(实际上不存在): 在所示的情况下,fieldA可以为null或fieldB可以为null,但不能同时为两者。 一种方法是创建自己的验证器,但是我想避免它已经存在。如果您已经验证过,请分享一个验证人…谢谢! 问题答案: 我终于写了整个验证器: 用法示例:

  • 问题内容: 我正在为我的BSc项目编写相当大的Web应用程序,并使用MySQL在PHP中编写它。 创建SQL表时,我应该使用唯一字段吗?我之所以这样问,是因为我正在向PHP中编写验证方法。例如,如果我想检查数据库中是否已经存在电子邮件地址,我将首先执行一条SQL语句,查看是否返回了任何电子邮件地址,然后将初始SQL数据插入数据库中。 如果我只是插入初始SQL数据,则它将在整个语句上引发错误,因为电

  • 我正在尝试使用<code>Hibernate Validator</code>验证请求对象。 作为一个简单的例子,假设我要验证的对象的类有一个<code>B bObj</code>字段,其中<code>B 因此,我实现了自己的自定义,它链接到自定义类。 DTO类 我的endpoint方法签名(其中调用验证器,并设置活动组): 我的验证器类 我想要实现的是基于活动组对同一字段应用不同的验证。活动组是

  • 我试图在上传图片之前验证我的表单,但是我在中间件上得到了空字符串 下面是我的中间件: 我知道我可以使用multer的fileFilter,但是有些时候我没有任何图像可以上传,只有string来存储和验证,我尝试将req.body从multipart/form-data解析为string,然后验证并使用next(),但是我得到了一个范围错误,我该如何解决这个问题呢?

  • 嗯,我读了几个问题(这里和其他网站)关于类级验证与Hibernate,我创建了注释和验证类,但当验证返回false,我得到一个异常(当验证返回true它的确定)类是无效的(显然是因为验证返回false),我的疑问是:它不是也返回验证消息吗?为什么返回异常代码: ValidBlock.java ValidBlockValidator。JAVA 我做了测试,我很确定我收到了Block对象,因为当验证返