Spring MVC:如何在控制器方法中手动启动验证

时间:2016-10-05 14:04:12

标签: validation spring-mvc

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

我想从列表中删除空行并在之后调用Spring验证器。我怎么能这样做?

这是一个Spring Boot项目。

2 个答案:

答案 0 :(得分:2)

这是如何在没有@valid注释的情况下进行验证的春季示例:

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

绑定到目标对象

binder.bind(propertyValues);

验证目标对象

binder.validate();

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

BindingResult results = binder.getBindingResult();

答案 1 :(得分: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了解有关此方案的更多信息