在 Spring MVC 之外手动调用 Spring 注释验证

Manually call Spring Annotation Validation Outside of Spring MVC

我有以下测试失败:

 @Test
 public void testValidation() {
    Validator validator = new LocalValidatorFactoryBean();
    Map<String, String> map = new HashMap<String, String>();
    MapBindingResult errors = new MapBindingResult(map, Foo.class.getName());

    Foo foo = new Foo();
    foo.setBar("ba");
    validator.validate(foo, errors);
    assertTrue(errors.hasFieldErrors());
 }

foo如下:

import javax.validation.constraints.Size;
public class Foo {
    @Size(min=9, max=9)
    private String bar;

    // ... public setter and getter for bar
}

我参考了 Manually call Spring Annotation Validation and Using Spring Validator outside of the context of Spring MVC 但我不确定为什么这个测试失败了。

您正在尝试使用一个实际上要在 Spring ApplicationContext 内部使用的 bean。要准备使用它,您还必须模仿 ApplicationContext 在对象初始化方面的行为。

LocalValidatorFactoryBean implements the InitializingBean界面。它包含一个方法,一旦对象被构建并且所有依赖项都被注入后,ApplicationContext 通常会调用该方法(与用 @PostConstruct 注释的方法相同)。

当您在 ApplicationContext 外部使用 bean 时,您必须在对象实际准备好使用之前手动调用 afterPropertiesSet 方法。