Проблемы переопределения свойства в null в объявлении bean-компонента Spring - PullRequest
0 голосов
/ 18 марта 2010

Просто интересно, есть ли в 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>

, таким образом, что дочерний объект переопределяет свойство в null.

Я знаю, что если вы не объявите свойство ни в родительском, ни в дочернем элементах, вы получите требуемый эффект, но, поскольку в большинстве мест валидатор ссылается на validatorImpl, я думал, что в качестве принципа наследования я смог бы переопределить свойство в null.

Я продолжаю получать:

15: 29: 50,141 ОШИБКА [PortletHotDeployListener: 534] org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем childController, определенным в ресурсе PortletContext [/WEB-INF/context/sugerencia-contex.x : Инициализация компонента не удалась; вложенным исключением является java.lang.NullPointerException org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем childController, определенным в ресурсе PortletContext [/WEB-INF/context/sugerencia-context.xml]: сбой инициализации компонента; вложенным исключением является 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>

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 марта 2010

Явно установка свойства на <null/> - это не то же самое, что не установка его. Например, метод установки свойства может проверить, что значение, которое вы вводите, не является нулевым.

Если вы посмотрите на исходный код BaseCommandController (который является суперклассом вашего контроллера), вы увидите, что setValidator такой проверки не выполняет. Однако, когда bean-компонент инициализируется в initApplicationContext(), он выполняет итерацию по массиву валидаторов, предполагая, что все они не равны NULL, и выдаст NPE, если в этом массиве есть ноль, что, скорее всего, происходит здесь. 1007 *

К сожалению, нет способа "сбросить" свойство, настроенное в определении родительского компонента. Вам нужно изменить определения, чтобы родитель не установил их.

0 голосов
/ 18 марта 2010

Я думаю, что проблема в вашем parent вы используете validator либо в setter методе, либо в afterPropertiesSet. Это может быть причиной для NPE. Проверьте это один раз, если вы не используете validator, который в вашем случае равен нулю где-либо на этапах инициализации в родительском классе, он должен работать нормально.

...