gpt4 book ai didi

java - Spring MVC validator : validate using current session object

转载 作者:行者123 更新时间:2023-12-01 04:21:34 24 4
gpt4 key购买 nike

我想使用自定义 Spring Validator 验证我的 MyAccount 表单。

基本的验证规则没有问题。

我现在有这个要求,这看起来非常明显和常见:

如果用户(当前登录)更改了他的用户名,我必须检查它是否已在使用中。如果它没有被改变,我很好(在检查时它肯定会被使用,这就是为什么我不想在这种情况下检查它)。问题是, validator 是 Spring 管理的单例,我似乎无权访问当前 session (我存储登录上下文的位置 - 即不是 Spring Security)。但我需要当前登录的用户,以便将其电子邮件与表单中输入的电子邮件进行比较。

这是我的场景,但问题实际上是关于如何使用用户 session 中的对象进行验证。

我考虑解决这个问题的方法:

  1. 仅在Validator中进行基本验证,并在Controller中完成我需要 session 的其余部分。似乎不是一个好的解决方案。

        @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
    }
    }
  2. Validator 添加第二个验证方法,如下所示

    public void validateWithCurrentCustomer(Customer current) {
    ...
    }

    并使用适当的对象从 Controller 显式调用它。好不了多少,但至少验证逻辑在一个类中,尽管分为两种方法,其中之一不是标准的。

  3. 没有 Validator Spring 管理的(单例)bean,但每次都在 initBinder 方法中创建它。而不是:

    @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));
    }

但这里的问题是,由于 validator 不是 Spring 管理的,因此很难将服务(如 CustomerService)注入(inject)到 validator 中,以检查电子邮件是否可用。

我是否遗漏了一些东西,还有其他方法可以实现我想要的吗?这似乎是一个常见问题,但我在 Google 或 SO 上找不到任何模式。

感谢您的提示。

最佳答案

您可以尝试从 validator 访问任何 Spring bean。也许这个答案可以有所帮助。 Where should I place validation code that requires access to database?

基本上,您可以创建一个 SpringBeanUtil 单例,它使您可以访问任何您想要的 bean。

关于java - Spring MVC validator : validate using current session object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18850812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com