2012-07-19 27 views
1

有沒有一種簡單的方法讓Spring bean使用JSR-303註釋驗證上下文啓動?我已經繼承了一些表示配置爲JSR-303註釋的POJO的類。這些都是在對象層次結構中傳遞的,所以我有點被卡住了。JSR-303關於Spring Bean屬性的註釋

我可以想象定義bean設置這樣的類的屬性,然後在上下文啓動時運行JSR-303驗證程序,以確保所有值都設置正確。

請注意,我是而不是詢問Spring MVC中綁定表單提交的驗證。

+0

發佈一些代碼,我們可以幫您 – 2012-07-19 08:16:48

回答

1

簡短的回答是沒有。雖然最初並未在JSR-303中提到,但它通常用於MVC數據綁定和驗證。我會嘗試以下。

由於您有JSR-303註釋,因此請配置JSR-303 validator in Spring context。在這種情況下,它將是引導標準JSR-303驗證機制的LocalValidatorFactoryBean。請注意,您仍然需要在您的類路徑中提供JSR-303的供應商/實現者(例如Hibernate Validator)。

當應用程序上下文啓動並準備就緒時,實現ApplicationContextListener<ContextStartedEvent>的實例以接收事件。此外,允許的豆得到的LocalValidatorFactoryBean一個實例:

public class GenericApplicationValidator implements ApplicationListener<ContextStartedEvent> { 

    private ValidatorFactoryBean validatorFactoryBean; 

    public void onApplicationEvent(ContextStartedEvent e) { 
    // Refer to next step 
    } 

    public void setValidatorFactoryBean(ValidatorFactoryBean vfb) { 
    this.validatorFactoryBean = vfb; 
    } 
} 

在該方法onApplicationEvent(ContextStartedEvent e)

  1. 取應用程序上下文的實例。
  2. 通過應用程序上下文,找到需要驗證的所有bean。
  3. 您有權訪問validatorFactoryBean.getValidator()
  4. 遍歷所有bean,使用驗證器並驗證bean。

請記住,我還沒有這樣做的經驗。但它在我看來可能是一種接近實現你所需要的方法。

2

如果你只想上下文初始化後,要做到這一點的驗證,你可以這樣做:

@Component 
public class MyValidator ApplicationListener<ContextRefreshedEvent> { 

    @Autowired private ListableBeanFactory bf; 
    @Autowired private Validator validator; 


    @Override 
    public void onApplicationEvent(ContextRefreshedEvent event) { 
     for (String name : bf.getBeanDefinitionNames()) { 
      Object bean = bf.getBean(name); 
      validator.validate(bean); 
     } 
    } 
} 

但我沒有測試它。

+0

這種方法適用於我。 – user871611 2017-01-09 08:30:01