如何在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 ---^