2012-10-31 41 views
1

在我們的代碼中,我們實現了org.springframework.validation.beanvalidation.LocalValidatorFactoryBean的子類,在我們自己的實現中覆蓋驗證(Object target,Errors錯誤),我們運行驗證,做一些額外的處理並註冊錯誤消息。春季子類化LocalValidatorFactoryBean的替代方案

從3.0升級到3.1,似乎不再調用此方法。一位同事調試了Spring代碼,發現它似乎調用了簽名驗證(Object target,Errors errors,Object ... validationHints)的方法,而舊的validate()會被簡單地跳過。更改爲使用validationHints方法使事情重新開始。

此修復程序感覺有點古怪,容易出現未來混亂。是否有另一種方法來處理驗證更具前瞻性?

+0

@無效的註釋是否執行相同的rt? – shazinltc

+0

我們使用註釋來標記應該驗證的表單部分,但是我們想要添加自己的驗證的額外處理,這就是爲什麼我們要繼承LocalValidatorFactoryBean的原因。 –

+0

我確實有同樣的問題:http://forum.springsource.org/showthread.php?134759-Extending-JSR-303-validation-quot-validate-quot-is-not-invoked-by-Valid-annotation什麼你選擇的解決方案? –

回答

4

在我們的項目中,我們採取了稍微不同的方法。我們也在使用Spring 3.1,並且我們都使用驗證和自定義驗證來註釋這兩個bean。我們的方法可能適用於或不適用於您的場景,因爲我不確定您在遷移到Spring 3.1之前最初使用的方法,但在此處。

當我們需要自定義驗證時,而不是擴展LocalValidatorFactoryBean,我們實現了org.springframework.validation.Validator類。因此,這個實現執行自己的自定義代碼並調用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(對象對象,錯誤錯誤)。再次,這就是爲什麼我不確定在我們的項目中採用的方法適用於您的方法,因爲我不確定您使用的是相同的驗證方法(對象,錯誤)。

無論如何,希望它有幫助。

+0

乾杯,我會看看,看看這是否可行 - 可能會有一段時間才能嘗試。我已經看到,我們之前使用了Validator接口的validate方法(與你的方法相同,只有一個子類或兩個子類),而當前工作的另一個驗證方法來自SmartValidator。 –