Не удалось создать поле autwire в spring. Зачем?
Я продолжаю получать эту ошибку и не могу понять, почему.. да, я знаю, что у многих людей были подобные проблемы, но чтение ответов, которые они получили, не решает мою проблему.
org.springframework.beans.factory.BeanCreationException: ошибка при создании bean с именем "contactController": не удалось выполнить инъекцию автоуведомленных зависимостей; Вложенное исключение - org.springframework.beans.factory.BeanCreationException: Не удалось создать поле autwire: private net.service.ContactService net.controller.ContactController.contactService; Вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: сопоставление bean типа [net.service.ContactService], найденного для зависимости: ожидается как минимум 1 bean, который квалифицируется как кандидат autwire для этой зависимости. Аннотации зависимостей: {@org.springframework.beans.factory.annotation.Autowired(required = true)}
здесь находится контроллер:
@Controller
@SessionAttributes
public class ContactController {
@Autowired
private ContactService contactService;
//methods...
}
ContactServiceImpl
@Service("contactService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class ContactServiceImpl implements ContactService {
@Autowired
private ContactDao contactDao;
public ContactServiceImpl() {
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void addContact(Contact contact) {
contactDao.saveContact(contact);
}
@Override
public List<Contact> getContacts() {
return contactDao.getAllContacts();
}
}
ContactDaoImpl
@Repository("contactDao")
public class ContactDaoImpl implements ContactDao {
@Autowired
private SessionFactory sessionFactory;
@Override
public void saveContact(Contact contact) {
sessionFactory.getCurrentSession().saveOrUpdate(contact);
}
@Override
@SuppressWarnings("unchecked")
public List<Contact> getAllContacts() {
return (List<Contact>) sessionFactory.getCurrentSession().createQuery("from contact c").list();
}
}
и spring -servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<context:property-placeholder location="classpath:jdbc.properties" />
<context:component-scan base-package="net.controller" />
<tx:annotation-driven transaction-manager="hibernateTransactionManager" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.user}" />
<property name="password" value="${database.password}" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>net.form.Contact</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
</bean>
<bean id="hibernateTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
Ответы
Ответ 1
В spring сервлет .xml:
<context:component-scan base-package="net.controller" />
(Я предположил, что служба impl находится в том же пакете, что и сервисный интерфейс net.service)
Я думаю, вам нужно добавить пакет net.service(или всю сеть) в сканирование компонентов. В настоящее время spring выполняет поиск только в net.controller для компонентов, а поскольку ваш сервис impl в net.service, он не будет создан экземпляром spring.
Ответ 2
Ну есть проблема с созданием ContactServiceImpl
bean. Во-первых, убедитесь, что класс фактически создан с помощью отладки конструктора no-args при запуске контекста Spring и при создании экземпляра ContactController
.
Если ContactServiceImpl
фактически создается экземпляром контекста Spring, но он просто не сопоставляется с аннотацией @Autowire
, попробуйте сделать более явным в своей аннотации. Вот парень, занимающийся подобной проблемой, как ваш, и дающий некоторые возможные решения:
http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/
Если вы спросите меня, я думаю, вы будете в порядке, если вы замените
@Autowired
private ContactService contactService;
с:
@Resource
@Qualifier("contactService")
private ContactService contactService;
Ответ 3
Я получал эту же ошибку, и поиск ее привел меня сюда. Мое исправление оказалось просто добавлением аннотации @Component к реализации абстрактного сервиса.
В этом случае это будет выглядеть так:
import org.springframework.stereotype.Component;
...
@Component
public class ContactServiceImpl implements ContactService {
Ответ 4
Когда вы получите эту ошибку, аннотация отсутствует.
Мне не хватало аннотации @service на службе. Когда я добавил эту аннотацию, она отлично работала для меня.
Ответ 5
Сегодня я столкнулся с такой же проблемой. Оказалось, что я забыл упомянуть аннотацию @Service/@Component для моего файла реализации службы, для которого spring не умеет autowire и не может создать bean.
Ответ 6
У меня была точно такая же проблема
попробуйте поместить два класса в один и тот же пакет и добавить строку в pom.xml
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-starter-web </artifactId>
<version> 1.2.0.RELEASE </version>
</dependency>
Ответ 7
В java config убедитесь, что вы импортировали свой конфиг в RootConfig, как это @Import (PersistenceJPAConfig.class)