@Autowired - не найден квалифицирующий компонент типа для зависимости
я начал свой проект с создания сущностей, служб и тестов JUnit для служб с использованием Spring и Hibernate. Все это прекрасно работает. Затем я добавил spring-mvc, чтобы сделать это веб-приложение, используя множество различных пошаговых руководств, но когда я пытаюсь сделать контроллер с аннотацией @Autowired, я получаю ошибки от Glassfish во время развертывания. Я думаю, что по какой-то причине весна не видит моих услуг, но после многих попыток я все еще не могу справиться оно.
тесты для службы с
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/beans.xml"})
и
@Autowired
MailManager mailManager;
работает правильно.
контроллеры без @Autowired тоже, я могу открыть свой проект в веб-браузере без беда.
/ src / main/resources / beans.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-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/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">
<context:property-placeholder location="jdbc.properties" />
<context:component-scan base-package="pl.com.radzikowski.webmail">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--<context:component-scan base-package="pl.com.radzikowski.webmail.service" />-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- Persistance Unit Manager for persistance options managing -->
<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="defaultDataSource" ref="dataSource"/>
</bean>
<!-- Entity Manager Factory for creating/updating DB schema based on persistence files and entity classes -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager" ref="persistenceUnitManager"/>
<property name="persistenceUnitName" value="WebMailPU"/>
</bean>
<!-- Hibernate Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--<property name="schemaUpdate" value="true" />-->
<property name="packagesToScan" value="pl.com.radzikowski.webmail.domain" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
</props>
</property>
</bean>
<!-- Hibernate Transaction Manager -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- Activates annotation based transaction management -->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
/ webapp/WEB-INF / web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring Web MVC Application</display-name>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
/веб-приложения/веб-инф/с MVC-диспетчер-сервлета.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="pl.com.radzikowski.webmail" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
ЛП.ком.Рамана радзиковского.электронная почта.обслуживание.AbstractManager
package pl.com.radzikowski.webmail.service;
import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Master Manager class providing basic fields for services.
* @author Maciej Radzikowski <maciej@radzikowski.com.pl>
*/
public class AbstractManager {
@Autowired
protected SessionFactory sessionFactory;
protected final Logger logger = Logger.getLogger(this.getClass());
}
ЛП.ком.Рамана радзиковского.электронная почта.обслуживание.MailManager
package pl.com.radzikowski.webmail.service;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
@Transactional
public class MailManager extends AbstractManager {
// some methods...
}
pl. com. radzikowski. webmail. HomeController
package pl.com.radzikowski.webmail.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import pl.com.radzikowski.webmail.service.MailManager;
@Controller
@RequestMapping("/")
public class HomeController {
@Autowired
public MailManager mailManager;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String homepage(ModelMap model) {
return "homepage";
}
}
ошибка:
SEVERE: Exception while loading the app
SEVERE: Undeployment failed for context /WebMail
SEVERE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public pl.com.radzikowski.webmail.service.MailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [pl.com.radzikowski.webmail.service.MailManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
извините за много код, но я не знаю, что может вызвать ошибки.
добавил
я создал интерфейс:
@Component
public interface IMailManager {
добавил реализует:
@Component
@Transactional
public class MailManager extends AbstractManager implements IMailManager {
и изменил autowired:
@Autowired
public IMailManager mailManager;
но он все равно выдает ошибки (также, когда я пробовал с @Qualifier)
..Не удалось autowire поле: public ЛП.ком.Рамана радзиковского.электронная почта.обслуживание.IMailManager ЛП.ком.Рамана радзиковского.электронная почта.контроллер.HomeController.mailManager...
я пробовал с различными комбинациями @Component и @Transactional тоже.
я не должен включать фасоль.XML в интернете.xml как-то?
14 ответов:
вы должны autowire интерфейс
AbstractManager
вместо классMailManager
. Если у вас есть различные имплеметацииAbstractManager
можно писать@Component("mailService")
а то@Autowired @Qualifier("mailService")
комбинация к классу autowire специфическому.Это связано с тем, что Spring создает и использует прокси-объекты на основе интерфейсов.
у меня это произошло, потому что мои тесты не были в том же пакете, что и мои компоненты. (Я переименовал свой пакет компонентов, но не мой тестовый пакет.) И я использовал
@ComponentScan
в моем тесте@Configuration
класс, поэтому мои тесты не находили компоненты, на которые они полагались.Так, дважды проверьте, что если вы получаете эту ошибку.
дело в том, что и контекст приложения, и контекст веб-приложения регистрируются в WebApplicationContext во время запуска сервера. При выполнении теста необходимо явно указать, какие контексты следует загрузить.
попробуйте это:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:/beans.xml", "/mvc-dispatcher-servlet.xml"})
провел много времени с этим! Моя вина! Позже обнаружил, что класс, на котором я объявил аннотацию
Service
илиComponent
был типа аннотация. Включил журналы отладки на Springframework, но никаких подсказок не было получено. Пожалуйста, проверьте, если класс, если абстрактного типа. Если затем применяется основное правило, невозможно создать экземпляр абстрактного класса.
можете ли вы попробовать аннотировать только вашу конкретную реализацию с помощью
@Component
? Может быть, следующее ответ могу помочь. Это своего рода аналогичная проблема. Я обычно помещаю весенние аннотации в классы реализации.
правильный способ должен быть autowire AbstractManager, как предложил Макс, но это должно работать нормально.
@Autowired @Qualifier(value="mailService") public MailManager mailManager;
и
@Component("mailService") @Transactional public class MailManager extends AbstractManager { }
Я недавно столкнулся с этим, и, как оказалось, я импортировал неправильную аннотацию в свой класс обслуживания. Netbeans имеет возможность скрыть операторы импорта, поэтому я не видел его в течение некоторого времени.
я использовал
@org.jvnet.hk2.annotations.Service
вместо@org.springframework.stereotype.Service
.
- одна из причин BeanB может не существовать в контексте
- еще одной причиной исключения является существование двух бобов
- или определения в контекстном компоненте, который не определен, запрашиваются по имени из контекста Spring
смотрите еще этот url:
http://www.baeldung.com/spring-nosuchbeandefinitionexception
Я предполагаю, что здесь
<context:component-scan base-package="pl.com.radzikowski.webmail" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>
все аннотации сначала отключаются с помощью use-default-filters= "false", а затем включаются только аннотации @Controller. Таким образом, ваша аннотация @Component не включена.
Если вы тестируете свой контроллер. Не забудьте использовать @WebAppConfiguration в тестовом классе.
<context:component-scan base-package="com.*" />
тот же вопрос прибыл, я решил его, сохранив аннотации нетронутыми и в dispatcher сервлет:: сохранение сканирования базового пакета как
com.*.
это сработало для меня.
У меня это произошло, потому что я добавил зависимость autowired в свой класс обслуживания, но забыл добавить ее к введенным издевательствам в моем тесте модуля обслуживания.
исключение модульного теста, по-видимому, сообщило о проблеме в классе обслуживания, когда проблема была фактически в модульном тесте. Оглядываясь назад, сообщение об ошибке точно сказало мне, в чем проблема.
вместо @Autowire MailManager mailManager, вы можете издеваться над Бобом, как показано ниже:
import org.springframework.boot.test.mock.mockito.MockBean; :: :: @MockBean MailManager mailManager;
кроме того, вы можете настроить
@MockBean MailManager mailManager;
отдельно в@SpringBootConfiguration
класс и инициализировать, как показано ниже:@Autowire MailManager mailManager
Это может помочь вам:
У меня такое же исключение в моем проекте. После поиска в то время как я обнаружил, что мне не хватает аннотации @Service к классу, где я реализую интерфейс, который я хочу @Autowired.
в коде вы можете добавить аннотацию @Service в класс MailManager.
@Transactional @Service public class MailManager extends AbstractManager implements IMailManager {