2014-01-06 4 views
0

У меня есть большая проблема с @Autowired что всегда вернуться за исключениемSpring 3 Autowired BeanInitializationException

Initialization боба не удалось; вложенное исключение org.springframework.beans.factory.BeanInitializationException: свойство «ServiceFactory» требуется для боба «A»

Вот краткое всего (я использую Spring 3.2 и я поставил всю банку в в нужном месте WEB-INF/lib).

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 

<context:annotation-config /> 
<context:component-scan base-package="com.sc" /> 

<!-- Comment out - we are going to use @Component @Autowired - 2014-01-07 
<bean id="A" class="com.sc.A"> 
    <property name="serviceFactory" ref="serviceFactoryBean" /> 
</bean> 
--> 

<bean id="serviceFactoryBean" class="com.sc.ServiceFactory" autowire="byName" /> 

</beans> 

Содержание класса com.sc.A

@Component 
public class A 
{ 

private Logger logger = Logger.getLogger(A.class); 

// @Autowired -- 2014-01-07 comment out as not need it since annotation in setter below 
// @Qualifier("serviceFactoryBean") 
private ServiceFactory serviceFactory; 

public A() 
{ } 

@Autowired // add 2014-01-07 
@Required 
public void setServiceFactory(ServiceFactory serviceFactory) 
{ 
    this.serviceFactory = serviceFactory; 
} 

public boolean checkSomething() 
{ 
    if(this.serviceFactory == null) 
    logger.error("serviceFactory is null. Autowired failed"); 

// do something 
} 


} // end of class A 

Содержание класса com.sc.ServiceFactory

// @Component -- comment out 2014-01-07 
public class ServiceFactory 
{ 
    // do whatever 
} 

Затем я составил классы и запустил его в причал, и когда причал поднялся, он всегда бросает длинное исключение

org.springframework.beans.factory.BeanCreationException: Ошибка создания bean-компонента с именем «A», указанным в URL-адресе ... Инициализация компонента не выполнена; вложенное исключение org.springframework.beans.factory.BeanInitializationException: свойство «ServiceFactory» требуется для боба «A»

У меня есть много попробовать комбинацию с и без аннотации к чему не привели. Очень неприятно сталкиваться с этой ошибкой.

Пожалуйста, помогите

+0

У вас есть геттер/сеттер для ServiceFactory в вашем А-классе? Также вы смешиваете что-то. Если вы используете @Autowired, вам не нужно определять компоненты в вашем xml вообще –

+0

да, я получил и установил в A-классе для serviceFactory. – Spring

+0

Я не уверен, но удалю 'autowire =" byName "' и посмотрим, работает ли он или нет. Кстати, '@ Required' вообще не требуется,' @ Autowired' имеет параметр для него, а его значение по умолчанию - 'required = true'. –

ответ

4

Есть несколько вещей, которые неправильно (или, вернее, неправильно поняли) в вашем вопросе.

С вашим текущим контекстом вы объявляете два определения бобов для каждого из A и ServiceFactory. Один из них неявно из аннотации @Component и <component-scan>, а другой из явных объявлений <bean>. Выберите тот или другой, или вы можете оказаться в положении, когда Spring не знает, что использовать.

С выше, что происходит в том, что Spring пытается генерировать A боб из-за его @Component аннотацию и видит @Required на методе setServiceFactory(), но не знает, что делать с ним. @Required «Javadoc состояние с

Отмечает метод (как правило, метод установки JavaBean) как „требуется“: то есть, метод сеттера должны быть сконфигурированы, чтобы быть зависимостей впрыска со значением.

Но в вашем случае это не так. Добавьте @Autowired к нему.

@Required 
@Autowired 
public void setServiceFactory(ServiceFactory serviceFactory) { 
    this.serviceFactory = serviceFactory; 
} 

Теперь Весна будет знать, что делать с этим методом, т.е. вставьте фасоль ServiceFactory.

+0

Я решил использовать аннотацию в классе А, поэтому я вынимаю (комментирую) из applicationContext.xml. Я удалил @Component из ServiceFactory, поэтому ServiceFactory использует только applicationContext. Я поставил Autowired, как вы предложили, и он все еще не работает. – Spring

+0

@Spring Вы можете отредактировать свой вопрос и добавить, какое исключение он дает вам сейчас? –

+0

@Spring Обратите внимание, что у вас уже есть '@ Autowired' в поле, вам это не нужно как для сеттера, так и для поля. –

0

Спасибо за решение.

Нижеследующее работало для меня после нескольких дней борьбы. Я пытался либо Required или Autowired согласно документации Spring, и она не работает

@Required
@Autowired