@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 60

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? Может быть, следующее ответ могу помочь. Это своего рода аналогичная проблема. Я обычно помещаю весенние аннотации в классы реализации.

https://stackoverflow.com/a/10322456/2619091

правильный способ должен быть 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 {