【问题标题】:Problems overriding a property to null in Spring bean declaration在 Spring bean 声明中将属性覆盖为 null 的问题
【发布时间】:2010-03-18 14:42:17
【问题描述】:

只是想知道 Spring 中是否有办法拥有父控制器:

<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>

,以这样的方式,孩子将一个属性覆盖为空。

我知道如果你没有在父级或子级中声明属性,你会得到想要的效果,但是在大多数地方validator指的是validatorImpl,我认为作为继承原则,我可以将属性覆盖为 null。

我不断得到:

15:29:50,141 错误 [PortletHotDeployListener:534] org.springframework.beans.factory.BeanCreationException:在 PortletContext 资源 [/WEB-INF/context/sugerencia-context.xml] 中创建名称为“childController”的 bean 时出错: 初始化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>

谢谢。

【问题讨论】:

  • 不知道ParentController是什么,我们无能为力
  • 为什么你需要知道 ParentController 是什么??
  • 因为你给它注入了一个空值,而我们不是通灵者。
  • 现在清楚了吗,还是您需要更多信息?

标签: spring overriding javabeans


【解决方案1】:

将属性显式设置为&lt;null/&gt; 与不设置它不同。例如,属性的 setter 方法可能会检查您注入的值是否为非空。

如果您查看BaseCommandController(它是您的控制器的超类)的源代码,您会发现setValidator 没有进行此类检查。但是,当 bean 在initApplicationContext() 中初始化时,它会遍历验证器数组,假设它们都是非空的,并且如果该数组中有空值,则会抛出 NPE,这可能是这里发生的情况。

不幸的是,无法“取消设置”已在父 bean 定义中配置的属性。您需要重新排列定义,以免父级设置它。

【讨论】:

  • 我同意你的观点,但那是一件令人头疼的事情!
  • 正如你所说,NPE 似乎是调用 setValidator (null) public final void setValidator(验证器验证器){ this.validators = new Validator[] {validator}; }
【解决方案2】:

我认为问题出在您的parent 中,您要么在setter 方法或afterPropertiesSet 中使用validator。这可能是NPE 的原因。检查一次,如果您没有使用validator,在您的情况下,它在父类的初始化阶段的任何地方都为空,它应该可以正常工作。

【讨论】:

  • 这不是问题,正如我所说,在父母和孩子中声明它都不会导致任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多