Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC验证程序:使用当前会话对象进行验证_Java_Spring_Validation_Spring Mvc - Fatal编程技术网

Java SpringMVC验证程序:使用当前会话对象进行验证

Java SpringMVC验证程序:使用当前会话对象进行验证,java,spring,validation,spring-mvc,Java,Spring,Validation,Spring Mvc,我想使用自定义Spring验证程序验证我的MyAccount表单 基本的验证规则没有问题 我现在有了这个要求,这似乎很明显,也很普遍: 如果当前登录的用户更改了用户名,我必须检查它是否已经在使用中。如果它没有被改变,我很好,它肯定会在使用时检查,这就是为什么我不想在这种情况下检查它。问题是,验证器是Spring管理的单例,我似乎无法访问存储登录上下文的当前会话,也就是说,不是Spring安全性。但我需要当前登录的用户,以便将其电子邮件与表单中输入的电子邮件进行比较 这是我的场景,但问题实际上是如

我想使用自定义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));
}