HV000030:找不到约束 'javax.validation.constraints.Size' 验证类型 'java.util.Optional<java.lang.String>' 的验证器

HV000030: No validator could be found for constraint 'javax.validation.constraints.Size' validating type 'java.util.Optional<java.lang.String>'

大家好,我正在尝试对 YAML 进行验证

- name: campo
        in: query
        schema:
          type: string
          pattern: '[S|N]' #pattern
          maxLength: 1

使用 maven spring 引导和委托。在 RestController 上,我添加了注释 @Validated 并且我能够验证 required=true 字段,但如果字段不是必需的,根据架构设计,参数将为 Optional<String>。对于这个java.util.Optional,试图测试和验证,抛出标题错误:

{
  "timestamp": "2020-10-21T07:50:18.651+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "HV000030: No validator could be found for constraint 'javax.validation.constraints.Size' validating type 'java.util.Optional<java.lang.String>'. Check configuration for 'metodo.campo'",
  "path": "/%7BbasePath%7D/microservicio/metodo"
}

¿ 无论如何要解决此问题以正确处理此 Optional<String> 验证?如果可以在 YAML + 验证(@Valid 和 @Validated)上完成,我们不想在 Java 上编写所有验证代码。

编辑:验证@Size 和其他是从 YAML 生成的,打开 api 版本 3.0.3

你应该写:Optional<@Size String>(它会检查可选中字符串的大小)而不是@Size Optional<String>(它应该检查可选的大小,这是没有意义的) .

参见Hibernate Validator: With java.util.Optional



package org.hibernate.validator.referenceguide.chapter02.containerelement.optional;

public class Car {

    private Optional<@MinTowingCapacity(1000) Integer> towingCapacity = Optional.empty();

    //...

}

较新版本Jakarta Bean Validation 2.0 newly supports Optional validation as of August 2019. You can find this information out at their changelog summary 2. What’s new:

Support for java.util.Optional

截至今年 9 月,唯一经过认证的实施是 Hibernate Validator 6.0.17.Final

考虑升级,否则您将不得不忽略尺寸验证并手动执行。