首页 > 解决方案 > HV000030:找不到约束“javax.validation.constraints.Size”验证类型“java.util.Optional”的验证器'

问题描述

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

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

使用 maven spring boot 和委托。在 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 和其他人是从带有开放 api 版本 3.0.3 的 YAML 生成的

标签: javavalidationconstraintsoptional

解决方案


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

请参阅休眠验证器:使用java.util.Optional



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

public class Car {

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

    //...

}

推荐阅读