我发现这个implementation基本上可以做我想要的。
@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)中的字段不可为空。所以会发生的事情是,在我将实体保存到数据库之前,它工作正常。
答案 0 :(得分:0)
我嵌入hibernate-validator
我的tests后也失败了。
如果您在列上声明了任何不可为空的约束,则为什么 nullable 列被
hibernate-validator
更改为不可空列?
hibernate-validator
会使列成为不可为空列,例如:
@[ConstraintComposition(OR) NotBlank Null]
// ^---- it is a @NotNull constraint
@NotNull
public @interface NotBlank {...}
如何来解决这个问题?
如果你在github上看到了我的tests,你可能会发现我使用了@Length
可以为空的约束,然后是hibernate-validator
根本不会更改原始列定义,例如:
@[ConstraintComposition(OR) Length(min = 1) Null]
//it is a nullable constraint ---^