Java SpringMVC验证程序:使用当前会话对象进行验证
我想使用自定义Spring验证程序验证我的MyAccount表单 基本的验证规则没有问题 我现在有了这个要求,这似乎很明显,也很普遍: 如果当前登录的用户更改了用户名,我必须检查它是否已经在使用中。如果它没有被改变,我很好,它肯定会在使用时检查,这就是为什么我不想在这种情况下检查它。问题是,验证器是Spring管理的单例,我似乎无法访问存储登录上下文的当前会话,也就是说,不是Spring安全性。但我需要当前登录的用户,以便将其电子邮件与表单中输入的电子邮件进行比较 这是我的场景,但问题实际上是如何使用用户会话中的对象进行验证 我想解决这个问题的方法是: 只在验证器中执行基本验证,在控制器中执行我需要会话的其余部分。这似乎不是个好办法Java SpringMVC验证程序:使用当前会话对象进行验证,java,spring,validation,spring-mvc,Java,Spring,Validation,Spring Mvc,我想使用自定义Spring验证程序验证我的MyAccount表单 基本的验证规则没有问题 我现在有了这个要求,这似乎很明显,也很普遍: 如果当前登录的用户更改了用户名,我必须检查它是否已经在使用中。如果它没有被改变,我很好,它肯定会在使用时检查,这就是为什么我不想在这种情况下检查它。问题是,验证器是Spring管理的单例,我似乎无法访问存储登录上下文的当前会话,也就是说,不是Spring安全性。但我需要当前登录的用户,以便将其电子邮件与表单中输入的电子邮件进行比较 这是我的场景,但问题实际上是如
@RequestMapping(value="/myaccount", method=RequestMethod.GET)
public String myAccount(@Valid MyAccountForm form, BindingResult result, HttpSession session)
{
boolean hasUsernameChanged = // check using session
if (hasUsernameChanged && CustomerService.customerAlreadyExists(form.getUsername()))
result.rejectValue("username", "my.error.code");
if (result.hasErrors()) {
// handle errors
} else {
// proceed
}
}
向验证器添加第二个validate方法,如下所示
并使用适当的对象从控制器显式调用它。虽然不是很好,但至少验证逻辑在一个类中,虽然分为两个方法,其中一个不是标准的
验证器没有Spring管理的单例bean,但每次都在initBinder方法中创建它。而不是:
@Autowired
public MyAccountController(MyAccountFormValidator validator)
{
this.validator = validator;
}
@InitBinder
protected void initBinder (WebDataBinder binder)
{
binder.setValidator(validator);
}
做
但这里的问题是,由于验证器不是Spring管理的,因此很难将CustomerService之类的服务注入验证器,以检查电子邮件是否可用
我是否错过了什么,是否有其他方法可以实现我的目标?这似乎是一个常见的问题,但我在谷歌上找不到任何模式
谢谢您的提示。您可以尝试从验证器访问任何Springbean。也许这个答案会有所帮助。
基本上,你可以创建一个SpringBeanUtil单例,它可以让你访问任何你想要的bean。你的答案是基于我的想法3吗?我已经有了这样一个助手,我将其标记为不推荐使用,以告诉开发人员不应该这样做。我只想将其用于遗留代码,目前无法将其转换为Spring代码。
@Autowired
public MyAccountController(MyAccountFormValidator validator)
{
this.validator = validator;
}
@InitBinder
protected void initBinder (WebDataBinder binder)
{
binder.setValidator(validator);
}
@InitBinder
protected void initBinder (WebDataBinder binder, HttpSession session)
{
Customer current = ...// get from session
binder.setValidator(new MyAccountFormValidator(current));
}