Java SpringBean自动布线错误

Java SpringBean自动布线错误,java,spring,autowired,Java,Spring,Autowired,我正在尝试在我的应用程序中实现电子邮件功能,但我一直在 No matching bean of type [org.springframework.mail.javamail.JavaMailSenderImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. 有人能指出我做错了什么吗 bean的xml配置为: <bean

我正在尝试在我的应用程序中实现电子邮件功能,但我一直在

No matching bean of type [org.springframework.mail.javamail.JavaMailSenderImpl] found for dependency:  expected at least 1 bean which qualifies as autowire candidate for this dependency.
有人能指出我做错了什么吗

bean的xml配置为:

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

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<context:annotation-config/>
//...other stuff

<beans:bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="EmailServer" />
</beans:bean>

<beans:bean id="emailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <beans:property name="session" ref="mailSession"/>
</beans:bean>

您需要将
添加到配置文件中,以便Spring自动连接带注释的bean


从错误消息中,我可以得出结论,自动连线正在工作,但它无法找到所需的bean


确保加载所有bean定义文件。

您的JavaMailSenderImpl类本身是否有@Service或类似的注释?这将导致Spring的组件扫描程序将它的一个实例放入Spring容器中,然后它可以自动连接到EmailServiceImpl上。

感谢大家的响应。我无法使自动连线正常工作,但我通过执行以下操作使整个电子邮件解决方案正常工作:

  • weblogic中的mailSession,jndi名称为“myMailSession”
  • 添加到servlet-context.xml:

    <beans:bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean">
        <beans:property name="jndiName" value="myMailSession" />
    </beans:bean>
    
    <beans:bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <beans:property name="session" ref="mailSession"/>
    </beans:bean>
    
    <beans:bean id="emailServiceImpl" class="com.name.here.business.EmailServiceImpl">
      <beans:property name="mailSender" ref="mailSender"/>
    </beans:bean>
    

    我就是这样修复的:

    我也遇到了这个问题,我试图通过手动加载app-context.xml文件,在测试过程中完美地遵循简单的在线教程,但当我尝试运行我的spring mvc应用程序时,它始终显示以下错误:

    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.mail.javamail.JavaMailSender] 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)}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:952)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:821)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:735)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
        ... 42 more
    
    在尝试了各种方法之后,我碰巧将这两行从JPA/DB配置文件移到了根配置文件的底部

    <context:annotation-config/>           
    <context:component-scan base-package="my.app.service.layer"/>
    
    
    
    我仍在学习Spring,但我认为它们出现的顺序存在问题

    编辑: 这个问题似乎澄清了订单中的问题:


    对于一个编码如下的电子邮件服务类,我一直在努力解决这个问题:

    @Service("emailService")
    public class EmailService {
      @Autowired private JavaMailSenderImpl mailSender;
      ...
      public void send(...) {
        // send logic
      }
    }
    
    我在阅读相关主题时遇到了一个解决方案。关键点是
    JavaMailSender
    接口在
    applicationContext.xml
    中定义为Spring
    JavaMailSenderImpl

    步骤1:修改应用程序上下文文件以包含以下bean定义:

    <bean id="mailSender" 
       class="org.springframework.mail.javamail.JavaMailSenderImpl"
      p:host="myMailserver.mycompany.com" />
    

    瞧!春天是快乐的。我希望听到对原始错误的正确解释。

    我已经尝试过了,它给出了相同的错误。我将把它添加回我原来的帖子中。还有其他想法吗?还有两件事你可以试试。在xml中添加另一行以指定扫描bean的位置,并尝试将电子邮件发件人bean上的autowire候选属性设置为true。我能够重现您的错误,组件扫描应该可以解决您的问题。我尝试了组件扫描和autowire候选,但不幸的是,这两种方法都不起作用。我已经在root-context.xml中进行了组件扫描。我还在上面的servlet-context.xml中添加了它,但它没有做任何事情:上面的代码使用了什么xml文件?您使用了多少种不同的xml文件?我遇到了同样的问题,在xml中配置时,一切都正常。从服务bean emailServiceImpl中删除了自动连线和@service注释。自动布线在其他bean中工作良好。我想知道JavaMail中的自动连线有什么问题。
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.mail.javamail.JavaMailSender] 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)}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:952)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:821)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:735)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
        ... 42 more
    
    <context:annotation-config/>           
    <context:component-scan base-package="my.app.service.layer"/>
    
    @Service("emailService")
    public class EmailService {
      @Autowired private JavaMailSenderImpl mailSender;
      ...
      public void send(...) {
        // send logic
      }
    }
    
    <bean id="mailSender" 
       class="org.springframework.mail.javamail.JavaMailSenderImpl"
      p:host="myMailserver.mycompany.com" />
    
    @Service("emailService")
    public class EmailService {
      @Autowired private JavaMailSender mailSender;   // Observe the change in the type
      ...