2011-04-16 42 views
2

比方說,我有一個Java類是這樣的:如何向Spring發信號通知Bean屬性必須填充?

public class PersonGrabber { 
    private PersonDAO dao; 

    public void setDao(PersonDao dao) { 
    this.dao = dao; 
    } 
    public PersonDAO getDao() { 
    return this.dao; 
    } 
    //... 
} 

而且我有一個相應的Spring bean是這樣的:

<bean id="personGrabber" class="com.stackoverflow.example.PersonGrabber"> 
    <property name="dao"><null/></property> 
</bean> 

現在,這是不好的,因爲我真的需要dao屬性在它變得有用之前被設置爲該bean上的某些東西。但是,我不想等到運行時纔會拋出NullPointerException。無論如何告訴Spring必須在使用bean property MUST才能使用它?理想情況下,我希望它在初始化時崩潰,這樣我就不必等待它發現。

我希望這樣的事情沿着線註釋:

public class PersonGrabber { 
    @SpringRequired 
    private PersonDAO dao; 
    //... 
} 

一些春天的老兵在那裏任何幫助嗎?

回答

5

對於你所擁有的類型,你在哪裏總是需要將其他屬性設置爲非空值,執行此操作最簡單的方法是雙重事件。使用對二傳手的@Required註解告訴Spring該方法總是被調用,以及設置器內進行檢查,看是否注入是一個真正的實例(即不爲空)。

@Required 
public void setDao(PersonDao dao) { 
    if (dao == null) 
     throw new IllegalArgumentException("property 'dao' is null"); 
    this.dao = dao; 
} 

最後小部分是你需要確保註釋處理與這在Spring配置文件(S)開機:

<context:annotation-config/> 

提醒你,有你有個好機會已經有了。

+1

另外要注意的是,你在二傳手驗證碼無法查詢有關其他任何豆,因爲這可能不能完全在點配置時,這就是所謂的。這對於非空檢查無關緊要。 – 2011-04-18 08:45:08

0

如何在spring中使用JSR 303驗證?你有什麼問題嗎?

鏈接here,萬一你以前沒見過它。

+0

其實我最後寫我自己的Spring bean後置處理器,它使用Hibernate的實現JSR 303的,這樣我可以把喜歡'@ NotNull'註解它們。 – daveslab 2012-01-11 17:08:13

3

你正在尋找的註解是@Required

您還可以使用init-method屬性上你的bean指向一個所有屬性被填充後調用方法。這將允許您執行安裝後驗證。

+1

但是'@ Required'只是解決方案的一部分;它不會阻止配置顯式爲null。 – 2011-04-16 07:15:31

+1

我的首選是使用init方法而不是註釋。 Annotations和InitializingBean接口在應用程序中引入了對Spring的直接依賴。我儘可能避免這種情況。 – Fortyrunner 2011-04-16 14:48:55

+0

偉大的筆記你們,謝謝! – daveslab 2011-04-18 02:10:06

2

另一種方式做到這一點是聲明bean類爲實現InitializingBean,並實現afterPropertiesSet方法來檢查屬性被設置爲可接受的值。