Java @Autowired-未找到依赖项类型的符合条件的bean

Java @Autowired-未找到依赖项类型的符合条件的bean,java,spring,spring-mvc,annotations,autowired,Java,Spring,Spring Mvc,Annotations,Autowired,我通过使用Spring和Hibernate为服务创建实体、服务和JUnit测试来启动我的项目。所有这些都非常有效。 然后,我添加了SpringMVC,以使用许多不同的逐步教程制作此web应用程序,但当我尝试使用@Autowired注释制作控制器时,我在部署期间从Glassfish获得错误。我猜出于某种原因,Spring没有看到我的服务,但经过多次尝试,我仍然无法处理它 对具有 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguratio

我通过使用Spring和Hibernate为服务创建实体、服务和JUnit测试来启动我的项目。所有这些都非常有效。 然后,我添加了SpringMVC,以使用许多不同的逐步教程制作此web应用程序,但当我尝试使用
@Autowired
注释制作控制器时,我在部署期间从Glassfish获得错误。我猜出于某种原因,Spring没有看到我的服务,但经过多次尝试,我仍然无法处理它

对具有

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/beans.xml"})

工作正常

没有
@Autowired
的控制器,我也可以在web浏览器中轻松打开我的项目

/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>
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";
    }

}
错误:

严重:加载应用程序时出现异常
严重:上下文/WebMail取消部署失败
严重:加载应用程序时出现异常:java.lang.IllegalStateException:ContainerBase.addChild:start:org.apache.catalina.LifecycleException:org.springframework.beans.factory.BeanCreationException:创建名为“homeController”的bean时出错:自动连线依赖项注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动关联字段:public pl.com.radzikowski.webmail.service.MailManager pl.com.radzikowski.webmail.controller.homecocontroller.MailManager;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException:未找到依赖项类型为[pl.com.radzikowski.webmail.service.MailManager]的符合条件的bean:应至少有1个符合此依赖项autowire候选项条件的bean。依赖项注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

很抱歉,有很多代码,但我不知道是什么导致了这个错误

已添加

我已经创建了界面:

@Component
public interface IMailManager {
添加的工具:

@Component
@Transactional
public class MailManager extends AbstractManager implements IMailManager {
并更改为自动连线:

@Autowired
public IMailManager mailManager;
但它仍然会抛出错误(当我尝试使用
@Qualifier
时也是如此)

…无法自动连线字段:public pl.com.radzikowski.webmail.service.IMailManager radzikowski.webmail.controller.HomeController.mailManager

我也尝试了
@组件
@事务
的不同组合


我不应该在web.xml中包含beans.xml吗?

问题是,在服务器启动期间,应用程序上下文和web应用程序上下文都在WebApplicationContext中注册。当您运行测试时,您必须明确告诉要加载哪些上下文

试试这个:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/beans.xml", "/mvc-dispatcher-servlet.xml"})

您应该自动连接接口
AbstractManager
,而不是类
MailManager
。如果您有不同的
AbstractManager
实现,您可以编写
@组件(“邮件服务”)
,然后将
@Autowired@Qualifier(“邮件服务”)
组合写入autowire特定的类


这是因为Spring基于接口创建和使用代理对象。

正确的方法应该是使用autowire AbstractManager,正如Max所建议的那样,但这也应该可以正常工作

@Autowired
@Qualifier(value="mailService")
public MailManager mailManager;


您能否尝试使用
@Component
仅注释您的具体实现?也许下面的内容会有所帮助。这是一个类似的问题。我通常在实现类中添加Spring注释


我花了很多时间在这上面!我的错!后来发现我声明注释
服务
组件
的类是抽象类型。已在Springframework上启用调试日志,但未收到任何提示。请检查类是否为抽象类型。如果应用了基本规则,则无法实例化抽象类。

之所以发生这种情况,是因为我的测试与我的组件不在同一个包中。(我重命名了我的组件包,但没有重命名我的测试包。)我在测试
@Configuration
类中使用
@ComponentScan
,因此我的测试找不到它们所依赖的组件

所以,如果您得到这个错误,请仔细检查。

我猜是这样的

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


首先通过
使用默认过滤器=“false”
禁用所有注释,然后仅启用
@Controller
注释。因此,您的
@组件
注释未启用。

我最近遇到了这个问题,结果是,我在服务类中导入了错误的注释。Netbeans有一个隐藏导入语句的选项,这就是为什么我有一段时间没有看到它的原因


如果您正在测试控制器,我使用了
@org.jvnet.hk2.annotations.Service
而不是
@org.springframework.stereotype.Service

。 不要忘记在测试类上使用@WebAppConfiguration。

这可能会帮助您:

我在我的项目中也有同样的例外。在进行搜索后,我发现我缺少类的
@Service
注释,我在该类中实现了我要
@Autowired
的接口

在代码中,您可以将
@Service
注释添加到
MailManager

@Transactional
@Service
public class MailManager extends AbstractManager implements IMailManager {
  • 上下文中可能不存在BeanB的一个原因
  • 异常的另一个原因是存在两个bean
  • 或者,未定义的上下文bean中的定义通过名称从Spring上下文中请求
查看此url的更多信息:



同样的问题也出现了,我通过保持注释完整并在dispatcherservlet中解决了它::将基本包扫描保持为
com.*.
这对我来说很有效

之所以发生这种情况,是因为我在服务类中添加了一个自连线依赖项,但在服务单元测试中忘记将其添加到注入的mock中

当问题实际发生在单元测试中时,单元测试异常似乎报告了服务类中的问题。在re
@Autowired
public IMailManager mailManager;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/beans.xml", "/mvc-dispatcher-servlet.xml"})
@Autowired
@Qualifier(value="mailService")
public MailManager mailManager;
@Component("mailService")
@Transactional
public class MailManager extends AbstractManager {
}
<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>
@Transactional
@Service
public class MailManager extends AbstractManager implements IMailManager {
 <context:component-scan base-package="com.*" />
import org.springframework.boot.test.mock.mockito.MockBean;

::
::

@MockBean MailManager mailManager;
@Autowire MailManager mailManager