如何在hibernate-validator中设置一个可选的/可空的属性?

我发现这个实现 ,基本上做我想要的。

@ConstraintComposition(OR) @NotBlank @Null @ReportAsSingleViolation @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Constraint(validatedBy = {}) public @interface NullOrNotBlank { String message() default "{org.hibernate.validator.constraints.NullOrNotBlank.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } 

和我一样使用它

 @field:NullOrNotBlank @field:Size(max = 50) var middleName: String? = null, 

我也试过了

 @field:NullOrNotBlank @field:Size(max = 50) @field:Column(nullable = true) var middleName: String? = null, 

但是这个复合约束使得数据库(MySQL)中的字段不能为空。 所以会发生什么,直到我将实体保存到数据库,它工作正常。

在嵌入hibernate-validator我的测试也失败了。

为什么 列被hibernate-validator更改为不可空列?

如果在列上声明了任何不可为空的约束, hibernate-validator将使该列为 不可空列,例如:

 @[ConstraintComposition(OR) NotBlank Null] // ^---- it is a @NotNull constraint @NotNull public @interface NotBlank {...} 

如何解决这个问题?

如果你已经在github上看到了我的测试 ,你可能会发现我使用了@Length这个可空的约束,那么hibernate-validator根本不会改变原来的列定义,例如:

 @[ConstraintComposition(OR) Length(min = 1) Null] //it is a nullable constraint ---^