2017-07-16 148 views
1

我发现这个implementation,基本上做我想要的。如何在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的)不能为空场。所以会发生什么,直到我将实体保存到数据库才能正常工作。

+0

NullOrNotBlank'的'生成列是'不NULL'会抛出时,我将与空财产 – jasperagrante

+0

嗨,我想你试着使用'hbm2ddl.auto'更新约束的实体错误在一列中。如果该列存在,它根本不会更新约束。所以你应该手动更新它。请看这里:https://stackoverflow.com/questions/15978368/hibernate-hbm2ddl-auto-update-doesnt-update-column-definitions-in-mysql/26681592 –

+0

现在呢?如果没有问题。你应该删除你的问题,因为它是重复的。 –

回答

0

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

为什么没有了可空列由hibernate-validator改为不可为空列?

hibernate-validator的意志使该列非可空列,如果你宣布对列的任何非可空约束,例如:

@[ConstraintComposition(OR) NotBlank Null] 
//       ^---- it is a @NotNull constraint 

@NotNull 
public @interface NotBlank {...} 

如何到解决这个问题?

IF你已经在github上看到我的tests,你也许发现,我用了一个@Length这是一个可空约束,那么hibernate-validator不改变原列定义可言,例如:

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

谢谢你的回答!我在我的实现中所做的是,我用'@Size(min = 1)'替换了'@ Length',以便它适用于其他数据类型。 – jasperagrante

+0

我也注意到我的旧实现忽略了'@ NotBlank'约束。因为在我将其更改为'@Size(min = 1)'后,一些测试声明违规次数失败。 – jasperagrante

+0

@jasperagrante根本没有。我发现'hibernate-validator'会在昨晚改变'DDL'的定义。 –

相关问题