Примитив Spring Autowire логический

Моя конфигурация XML включает следующие определения bean-компонентов:

<bean id="abstractFormAction" class="staffing.server.action.form.AbstractFormAction" abstract="true" parent="baseAction">
    <property name="volunteerSaver" ref="volunteerSaver"/>
    <property name="emailSender" ref="emailSender"/> 
    <property name="closed" value="${form.closed}"/>
</bean>

<bean id="volunteerFormAction" class="staffing.server.action.form.VolunteerFormAction" parent="abstractFormAction">
    <property name="captchaGenerator" ref="captcha"/>
</bean>

Указывая, что VolunteerFormAction является конкретной реализацией AbstactFormAction и наследует свойства AbstactFormAction.

В AbstractFormAction я объявляю следующие свойства:

@Autowired protected VolunteerSaver volunteerSaver;
@Autowired protected EmailSender emailSender;
@Autowired protected boolean closed;

При попытке развернуть возникает следующее исключение:

org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем 'volunteerFormAction': не удалось ввести автоматически подключенные зависимости; вложенное исключение - org.springframework.beans.factory.BeanCreationException: не удалось автоматически подключить поле: protected boolean staffing.server.action.form.AbstractFormAction.closed; вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: для зависимости не найдено подходящего bean-компонента типа [boolean]: ожидается как минимум 1 bean-компонент, который квалифицируется как кандидат autowire для этой зависимости. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}

Кажется, он жалуется, что не может найти bean-компонент byte boolean. Но зачем ему нужен bean-компонент, если свойство было определено как «закрытое» по значению, а не по ссылке?


person NickJ    schedule 23.02.2013    source источник


Ответы (3)


Вам необходимо использовать Аннотация @Value для передачи значений с использованием заполнителей свойств. @Autowire ожидает, что компонент указанного типа будет присутствовать в applicationContext.

Если вы автоматически подключаете значения, почему вы передаете значения в определение bean-компонента? Я думаю, что тебе нужно

<bean id="abstractFormAction" class="staffing.server.action.form.AbstractFormAction" abstract="true" parent="baseAction"><bean>
<bean id="volunteerFormAction" class="staffing.server.action.form.VolunteerFormAction" parent="abstractFormAction">
    <property name="captchaGenerator" ref="captcha"/>
</bean>

и

@Autowired protected VolunteerSaver volunteerSaver;
@Autowired protected EmailSender emailSender;
@Value("#{form.closed}") protected boolean closed;

Если вы можете использовать компонентное сканирование, вам даже не нужно указывать создание bean-компонентов

Вы можете добавить <context:component-scan base-package="<your base package>"/> в файл context.xml и добавить аннотацию @Controller в файл контроллера.

person Arun P Johny    schedule 23.02.2013
comment
Если контекст настроен правильно, полное определение bean-компонента в XML не приведет к указанной ошибке, потому что Spring увидит, что значение уже было предоставлено для поля. - person Ryan Stewart; 23.02.2013

Вы не должны аннотировать closed с помощью @Autowired.

@Autowired указывает Spring на поиск bean-компонента типа автоматически связанного поля (boolean) в вашем контексте, поэтому он жалуется на «Нет подходящего bean-компонента типа [boolean]»

Если вы вводите значение из конфигурации xml, в этом поле нет необходимости в каких-либо аннотациях.

person zagyi    schedule 23.02.2013

Судя по показанному вами коду, вполне вероятно, что у вас возникла проблема с загрузкой контекстов Spring. Я предполагаю, что вы неправильно сканируете свои контроллеры как в корневом контексте веб-приложения, так и в дочернем контексте, где контроллеры предполагается должны жить. Это означает, что создается два экземпляра этого класса, и только один из них настраивается через XML. Spring пытается автоматически подключить другой экземпляр и выдает данную ошибку. Вы найдете описания проблемы и решения в нескольких других ответах SO, например:

Объявление Spring Bean в родительском контексте и дочернем контексте < / а>

Справка / объяснение иерархии конфигурации XML-файла Spring

Spring-MVC: что такое контекст и пространство имен? < / а>

Если вы предоставите более подробную информацию о своих файлах конфигурации и конфигурации контекста, кто-то сможет указать, в чем именно вы ошиблись.

person Ryan Stewart    schedule 23.02.2013