如何在hibernate-validator中创建可选/可空属性?

时间:2017-07-16 08:51:10

标签: java hibernate jpa kotlin

我发现这个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)中的字段不可为空。所以会发生的事情是,在我将实体保存到数据库之前,它工作正常。

1 个答案:

答案 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 ---^