2012-10-15 78 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连接到您的控制器,而不是实例化它,关于何时触发它,因为它完全在您的控制之下(因为您现在明确地调用验证),您可以选择在适当的点你的代码 –