在 Spring 中继承 LocalValidatorFactoryBean 的替代方法

TV'*_*ank 2 validation spring

在我们的代码中,我们实现了 org.springframework.validation.beanvalidation.LocalValidatorFactoryBean 的子类,使用我们自己的实现覆盖了 validate(Object target, Errors errors) ,我们在其中运行验证,做一些额外的处理并注册错误消息。

从3.0升级到3.1,好像不再调用这个方法了。同事调试spring代码,发现好像是调用了签名为validate(Object target, Errors errors, Object...validationHints)的方法,直接跳过了旧的validate()。更改为使用带有validationHints 的方法使事情再次起作用。

这个修复感觉有点奇怪,并且容易在未来混淆。是否有另一种方法来处理更面向未来的验证?

vin*_*tks 5

在我们的项目中,我们采用了稍微不同的方法。我们也在使用 Spring 3.1,并且我们用验证和自定义验证对两个 bean 进行了注释。我们的方法可能适用于您的场景,也可能不适用,因为在迁移到 Spring 3.1 之前,我不确定您最初使用的方法,但这里是。

当我们需要自定义验证时,我们实现 org.springframework.validation.Validator 类,而不是扩展 LocalValidatorFactoryBean。所以这个实现执行它自己的自定义代码并调用 Spring 的默认验证,它通过一个 bean 公开,该 bean 自动装配到我们的自定义验证器中。这是验证器代码:

@Component("myValidator")
public class MyValidator implements Validator {

@Autowired
private Validator springValidator;

@Override
public boolean supports(Class<?> clazz) {
    return MyObject.class.isAssignableFrom(clazz);
}

@Override
public void validate(Object object, Errors errors) {
    MyObject myObject = (MyObject) object;

    // invoke spring default validator so validation annotations are processed
    springValidator.validate(myObject, errors);

    // custom validation
    ....
Run Code Online (Sandbox Code Playgroud)

我们在 spring xml 文件中声明了以下 bean:

<bean id="springValidator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
Run Code Online (Sandbox Code Playgroud)

通过上述实现,需要调用验证的类将通过调用 validator.validate(Object object, Errors errors) 来实现。再次,这就是为什么我不确定我们项目中采用的方法是否适用于您的方法,因为我不确定您是否使用了相同的 validate(Object, Errors) 方法。

无论如何,希望它有所帮助。