protobuf 上的级联 bean 验证生成的 Java 对象不起作用

Cascaded bean validation on protobuf generated Java object not working

我正在尝试使用 Bean 验证来验证由 protobuf 消息生成的 Java 对象。我正在使用 Hibernate Validator's Programmatic constraint definition 流畅 API。它适用于直接对象字段(实际上我正在验证“getter”)但由于某种原因 valid() 方法未触发级联对象的验证。

我已经尝试创建常规 Java 对象(没有验证注释的 POJO,并且只有我正在测试的字段的 getter)并应用相同的 Hibernate 验证器约束映射 - 它工作正常。

您知道为什么这种方法不适用于从 protobuf 消息生成的 Java 对象吗?

// protobuf example
message Car {
  com.mycompany.Driver driver = 1;
  string manufacturer = 2;
  ...
}

message Driver {
  string name = 1;
  ...
}


// Java code
configuration.createConstraintMapping()
  .type(Car.class)
    .getter("driver")
      .valid()
    .getter("manufacturer")
      .constraint(new NotEmptyDef())

  .type(Driver.class)
    .getter("name")
      .constraint(new NotEmptyDef());

 ...

 Car car = new Car();
 car.setDriver(new Driver());

 validator.validate(car);
 // then - validation does not validate Driver object

一位同事发现了一个问题。我们不得不更改 DefaultGetterPropertySelectionStrategy (link to documentation)。默认策略下,getter 方法被视为方法 Object get*()boolean is*()boolean has*()。由于从 protobuf 生成的 Java 类 包含 boolean has*() 以指示 属性 是否可用 - 它被 Hibernate Validator 错误地用作有效的 getter方法。

因此,解决方案是基于 DefaultGetterPropertySelectionStrategy 创建自定义 getter 方法策略并排除 has*()。然后在创建Validator的时候注册为:

...
Validator validator = configuration.addMapping(configuration.createConstraintMapping())
                .getterPropertySelectionStrategy(new ProtobufGetterPropertySelectionStrategy())
                .buildValidatorFactory()
                .getValidator();