2017-07-16 38 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'的定義。 –

相關問題