【问题标题】:Spring MVC: How to manually initiate validation later in controller methodSpring MVC:如何稍后在控制器方法中手动启动验证
【发布时间】:2017-02-14 00:37:56
【问题描述】:

我有一个控制器方法,它接收一个命令对象,其中包含一个为验证而注释的对象列表。但是,应该忽略完全空的项目,所以我不能在控制器方法头中使用@Valid,因为它会为所有列表项的所有字段生成错误。

我想从列表中删除空行,然后调用 Spring 验证器。我该怎么做?

这是一个 Spring Boot 项目。

【问题讨论】:

  • 请查看这篇文章,认为有合适的例子stackoverflow.com/questions/19190592/…
  • 我记得之前发现这个我没用过。尝试注入 SmartValidator 会导致没有为依赖项找到符合条件的 bean [org.springframework.validation.SmartValidator]:预计至少有 1 个符合自动装配候选条件的 bean。并且尝试注入 Spring 的验证器失败,因为找到了太多的 bean,包括我的自定义验证器。
  • 好的,通过@Autowired @Qualifier("mvcValidator") Validator mvcValidator;成功注入

标签: validation spring-mvc


【解决方案1】:

这是一个 Spring 示例,说明如何在没有 @valid 注释的情况下进行验证:

Foo target = new Foo();
DataBinder binder = new DataBinder(target);
binder.setValidator(new FooValidator());

绑定到目标对象

binder.bind(propertyValues);

验证目标对象

binder.validate();

获取包含任何验证错误的 BindingResult

BindingResult results = binder.getBindingResult();

【讨论】:

  • 对不起,propertyValues 是从哪里来的?
【解决方案2】:

可能为时已晚。但它可以帮助其他人。

实际上,您需要在上下文中使用LocalValidatorFactoryBean 来显式调用验证器。在您的任何上下文中,您都可以像

一样标记 bean
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
     <property name="validationMessageSource" ref="messageSource"/>
</bean>

在你的控制器Autowire bean 中显式调用validate() 方法

    @Autowired
    private Validator validator;

    @Autowired
    private MyCustomValidator customValidator;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addValidators(smartValidator, customValidator);
    }

    public String save(@ModelAttribute FooModel foo, BindingResult result) {
        // ... your cutom logic and processing
        validator.validate(foo, bindingResult);
        customValidator.validate(foo, bindingResult);
        if (result.hasErrors()) {
            // ... on any validation errors
        }

        return "view";
    }

您可以通过this 了解有关此方案的更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-10
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多