Spring MVC 3.0自定义验证 - 通过@Model验证器
问题描述:
我想在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 ???
}
答
怀疑,如果你可以,但有两种解决方法:
一个。如果您正在查找的数据持续存在,可能最好在验证器中再次检索并使用该数据进行验证,因此,例如,如果您正在验证人员和个人帐户详细信息,则可以从您的案例中检索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..
谢谢Biju。我不认为我可以写我自己的validate()方法。我想知道如何通过列表作为验证方法签名不支持它....'公共无效验证(对象obj,错误的错误)'''好吧,如果我采取这种方法,我必须调用验证程序('ServiceValidator s = new ServiceValidator()') –
aprajitha
我的应用程序中有两个页面。一个页面收集人员信息(使用注释进行验证)和另一个页面,我们可以在其中添加帐户给人员。我不希望自定义验证程序在我提交第一页时触发,但我需要在第二页。我只有一个控制器。如果我将我的ServiceValidator绑定到我的唯一控制器,那么即使提交第一页时也会调用它。谢谢。 – aprajitha
您可以将ServiceValidator连接到您的控制器,而不是实例化它,关于何时触发它,因为它完全在您的控制之下(因为您现在明确地调用验证),您可以选择在适当的点你的代码 –