2012-10-15 83 views
0

我想在Spring MVC應用程序中編寫自定義驗證器。我想知道是否有辦法將@Model對象傳遞給自定義彈簧驗證器?Spring MVC 3.0自定義驗證 - 通過@Model驗證器

說,我有一個Person對象和Account對象。我必須編寫一個自定義驗證器來驗證Person,但驗證依賴於Account對象和會話中的其他對象。

例如,人員不能超過3個賬戶,賬戶類型必須是特定類別且不超過3年(此值,即根據已登錄且處於會話中的配置文件,年數是動態的) 。

如何將兩個對象,特別是@Model傳遞給驗證器。

public class ServiceValidator implements Validator { 

@Autowired 
private ServiceDAO servicesDao; 

@Override 
public boolean supports(Class<?> clasz) { 
    return clasz.isAssignableFrom(Person.class); 
} 

@Override 
public void validate(Object obj, Errors errors) { 
    Person subscriber = (Person) obj; 
    // How can I access @Model object here ??? 

} 

回答

1

懷疑,如果你可以,但有兩種解決方法:

一個。如果您正在查找的數據持續存在,可能最好在驗證器中再次檢索並使用該數據進行驗證,因此,例如,如果您正在驗證人員和個人帳戶詳細信息,則可以從您的案例中檢索DB,然後從數據庫獲取它並使用檢索到的數據在驗證程序中進行驗證。

b。也許這是一個更好的辦法如果你需要使用驗證名額是相當侷限:

public class ServiceValidator { 

@Autowired 
private ServiceDAO servicesDao; 

public void validate(Person subscriber, List<Account> accounts, ..., Errors errors) { 


} 

只需直接從requestmapped方法調用上面的驗證..

在您的控制器。 。

List<Account> accounts = //retrieve from session 
serviceValidator.validate(subscriber, accounts, ...errors); 
if (errors.hasErrors()).. 
else.. 
+0

謝謝Biju。我不認爲我可以寫我自己的validate()方法。我想知道如何通過列表作爲驗證方法簽名不支持它....'公共無效驗證(對象obj,錯誤的錯誤)'''好吧,如果我採取這種方法,我必須調用驗證程序('ServiceValidator s = new ServiceValidator()') – aprajitha

+0

我的應用程序中有兩個頁面。一個頁面收集人員信息(使用註釋進行驗證)和另一個頁面,我們可以在其中添加帳戶給人員。我不希望自定義驗證程序在我提交第一頁時觸發,但我需要在第二頁。我只有一個控制器。如果我將我的ServiceValidator綁定到我的唯一控制器,那麼即使提交第一頁時也會調用它。謝謝。 – aprajitha

+0

您可以將ServiceValidator連接到您的控制器,而不是實例化它,關於何時觸發它,因爲它完全在您的控制之下(因爲您現在明確地調用驗證),您可以選擇在適當的點你的代碼 –