2013-04-16 39 views
3

我使用Hibernate Validator作爲JSR-303實現。JSR-303如何以不同方式驗證兩個子對象

假設我有:

class Form { 
    @Valid 
    private Owner mainOwner; 
    @Valid 
    private Owner secondOwner; 
    // ... many other fields 
} 

class Owner { 
    @DriverLicenseValid // some custom validation 
    private String driverLicense; 
    // ... many other fields 
} 

// ... 

Form myForm; 
validator.validate(myForm); 

見,我想驗證整個表單,它包含了類型所有者的兩個類似的子對象。問題是,對於mainOwner driverLicense應該是@NotNull,對於secondOwner則應該是@Null。

我不能在這裏使用組(我可以嗎?),因爲整個模型是通過一個validate()調用來檢查的。沒有任何方法可以解決此問題,而無需將此規則作爲Form級別上的自定義約束進行編寫?

回答

0

FormmainOwner字段上創建驗證註釋,該驗證註釋驗證Owner實例具有設置的驅動程序許可證。

@DriverLicenseValid註釋應該遵循jsr-303規範中null值默認有效的建議。所以你不需要改變Owner類。

+0

謝謝,但我問是否可以實現沒有自定義約束的表單級別 - 即上面的mainOwner字段。也許我沒有正確表達這一點。然而,既然你提出了我認爲自己的解決方案,我認爲沒有其他辦法。好吧,ScriptAssert肯定會這樣做,但它與編寫自定義驗證器幾乎相同。 –

+1

@RodionGorkovenko我想不出任何其他合理的方式來做到這一點。所以你應該堅持你的第一個想法。 – SpaceTrucker

0

如果您使用Hibernate Validator 4.x,則可以使用此forum post中所述的自定義組序列提供程序。

+0

您能否解釋一下我如何在這種情況下使用它。如果我註釋Owner類,那麼我將只在getValidationGroups方法中鏈接到Owner實例。這個實例無法說明它是由mainOwner還是secondOwner引用的。如果我註釋表單本身 - 我無法理解它爲驗證所有者所做的貢獻。我爲我的愚蠢感到抱歉。 –

+0

您必須將狀態/角色過濾到「所有者」實例,例如像這樣:'私人所有者mainOwner =新所有者(「主」);'。然後,在默認的組序列提供程序中,您可以訪問角色並返回正確的默認組序列。 – Gunnar

+0

啊,謝謝。儘管這絕對不是我想要的。無論如何感謝有用的信息。 –

相關問題