替代在Spring中继承LocalValidatorFactoryBean

时间:2012-10-31 10:05:01

标签: spring validation

在我们的代码中,我们已经实现了org.springframework.validation.beanvalidation.LocalValidatorFactoryBean的子类,使用我们自己的实现来覆盖validate(对象目标,错误错误),我们运行验证,执行一些额外的处理并注册错误消息。 / p>

从3.0升级到3.1,似乎不再调用此方法。一位同事调试了spring代码,发现似乎调用了带有签名validate(Object target,Errors errors,Object ... validationHints)的方法,而只是跳过了旧的validate()。更改为使用validationHints方法使事情再次起作用。

这种修复方式有点奇怪,容易引起混淆。是否有另一种方法可以处理更具前瞻性的验证?

1 个答案:

答案 0 :(得分:4)

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

当我们需要自定义验证时,我们实现了org.springframework.validation.Validator类,而不是扩展LocalValidatorFactoryBean。所以这个实现执行它自己的自定义代码并调用Spring的默认验证,它通过自动连接到我们的自定义验证器的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
    ....

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

<bean id="springValidator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

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

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