2012-03-27 62 views
37

我試圖創建Hibernate Validator bean,並遇到了這個問題,在另一個類中從靜態工廠方法創建一個bean。我發現Spring方法讓我的Validator bean初始化(解決方案在底部),但問題本身仍未解決。此處使用驗證器作爲示例。從另一個類的靜態方法初始化Spring bean?

這是我如何使用Java創建的校驗器實例

import javax.validation.Validation; 
import javax.validation.Validator; 
import javax.validation.ValidatorFactory; 

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
Validator validator = factory.getValidator(); 

這是我試過的applicationContext.xml來創建bean

<bean id="validatorFactory" 
    class="javax.validation.ValidatorFactory" 
    factory-method="javax.validation.Validation.buildDefaultValidatorFactory" /> 

<bean id="validator" 
    class="javax.validation.Validator" 
    factory-bean="validatorFactory" 
    factory-method="getValidator" /> 

我的理解是,在「出廠方法「,您只能訪問在」class「參數中定義的Class中定義的靜態方法。由於該方法buildDefaultValidatorFactory()是靜態的,我不能創建驗證的一個實例,並把它作爲「工廠豆」爲validatorFactory這樣的:

<bean id="validation" class="javax.validation.Validation" /> 

<bean id="validatorFactory" 
    class="javax.validation.ValidatorFactory" 
    factory-bean="validation" 
    factory-method="buildDefaultValidatorFactory" /> 

這結束了對錯誤信息

「檢查具有指定名稱的方法依然存在,它是非靜態

問題是你怎麼會在這種春季的情況下創建豆?

這是我如何解決了這個問題,驗證:

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

回答

46

factory-method應該只包含方法的名稱,不包括類名。

如果要使用靜態工廠,請將工廠(!)的class指定給bean聲明,如果要使用實例工廠,請將factory-bean指定給bean聲明,但不要同時提供:創建的bean的類沒有在bean聲明中給出。

所以,一個完整的例子應該是這樣的,使用validatorFactory靜態工廠和實例工廠validator

<bean id="validatorFactory" 
    class="javax.validation.Validation" 
    factory-method="buildDefaultValidatorFactory" /> 

<bean id="validator" 
    factory-bean="validatorFactory" 
    factory-method="getValidator" /> 

查看文檔的詳細信息:

http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-class-static-factory-method

要回答你的問題 - 你如何在這種春季的情況下創建bean? - 完全按照此處顯示的內容進行操作,或者如果可以,請使用類似LocalValidatorFactoryBean這樣的實用程序類,它可以簡化Spring配置。

+0

類名是爲了證明我想要做的事情。正如我所說的「我所瞭解的是,在」工廠方法「中,只能訪問在」類「參數中定義的類中定義的靜態方法。」 – Spaideri 2012-03-27 07:56:24

+0

這是正確的 - 如果您給出'class'參數,那麼工廠方法必須是該類的靜態方法,如創建'validatorFactory'所示。 – 2012-03-27 13:10:42

0

你試過這個嗎?

<bean id="validatorFactory" 
class="javax.validation.Validation" 
factory-method="buildDefaultValidatorFactory" /> 

<bean id="validator" 
class="javax.validation.Validator" 
factory-bean="validatorFactory" 
factory-method="getValidator" /> 
+2

嗨!方法buildDefaultValidatorFactory是類javax.validation.Validation的靜態方法 – Spaideri 2012-03-27 08:39:25