2010-03-18 58 views
0

爲null,只是不知道是否有在春天有個辦法有一個父控制器:問題壓倒一切的屬性在Spring bean聲明

<bean id="parentController" class="org.springframework.web.portlet.mvc.SimpleFormController" abstract="true"> 
    <property name="validator" ref="validatorImpl"/> 
    ... 
</bean> 

,而一個類擴展它:

<bean id="child1Controller" class="com.portlet.controller.Child1Controller" parent="parentController"> 
    <property name="validator"><null/></property> 
    ... 
</bean> 

<bean id="child2Controller" class="com.portlet.controller.Child2Controller" parent="parentController"> 
    ... 
</bean> 

,以這樣的方式,孩子覆蓋一個屬性爲null。

我知道如果你沒有在父母或孩子中聲明屬性,你會得到想要的效果,但是在大多數地方,驗證者指的是validatorImpl,我認爲這是一個繼承原則,我會能夠覆蓋一個屬性爲null。

我不斷收到:

15:29:50141錯誤[PortletHotDeployListener:534] org.springframework.beans.factory.BeanCreationException:錯誤創建名稱爲豆 'childController' 在PortletContext資源定義[/ WEB-INF /context/sugerencia-context.xml]:bean初始化失敗;嵌套異常是java.lang.NullPointerException org.springframework.beans.factory.BeanCreationException:在PortletContext資源[/WEB-INF/context/sugerencia-context.xml]中定義的名稱爲'childController'的bean創建時出錯:bean初始化失敗;嵌套的例外是顯示java.lang.NullPointerException

在另一方面,

<bean id="parentController" class="org.springframework.web.portlet.mvc.SimpleFormController" abstract="true"> 
    ... 
</bean> 

<bean id="child1Controller" class="com.portlet.controller.Child1Controller" parent="parentController"> 
    ... 
</bean> 

<bean id="child2Controller" class="com.portlet.controller.Child2Controller" parent="parentController"> 
    <property name="validator" ref="validatorImpl"/> 
    ... 
</bean> 

感謝。

+0

不知道「ParentController」是什麼,我們無法幫助 – skaffman 2010-03-18 14:43:37

+0

爲什麼你需要知道什麼ParentController? – 2010-03-18 14:45:45

+0

因爲你注入了一個空值,所以我們不是通靈。 – skaffman 2010-03-18 14:47:36

回答

1

將屬性明確設置爲<null/>與設置屬性不同。例如,該屬性的setter方法可能會檢查您注入的值是否爲非null。

如果你看BaseCommandController(它是你的控制器的超類)的源代碼,你會看到setValidator沒有這樣的檢查。然而,當bean在initApplicationContext()中初始化時,它會迭代驗證器數組,假設它們都是非空的,並且如果該數組中存在null,則會拋出NPE,如果這裏可能發生了什麼情況。

不幸的是,沒有辦法「解除」在父bean定義中配置的屬性。您需要重新排列定義,以便父級不設置它。

+0

我同意你的看法,但這是一個痛苦的脖子! – 2010-03-18 15:28:04

+0

正如你所說,NPE似乎是調用this.validators [i] .supports(this的結果。(null) public final void setValidator(Validator validator){this.validators = new Validator [] {validator};}} } – 2010-03-18 15:35:02

0

我認爲這個問題是在你的parent你要麼在任何setter方法或afterPropertiesSet使用validator。這可能是NPE的原因。檢查一次,如果你沒有使用validator,你的情況在你父類的初始化階段的任何地方都是空的,它應該可以正常工作。

+0

正如我所說的那樣,這並不是問題,並且不會在父母或孩子中宣稱它會造成任何問題。 – 2010-03-18 15:26:00