2011-12-27 110 views
6

我想在我的应用程序来实现电子邮件功能,但我不断收到的Spring 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. 

任何人都可以指出我在做什么错误?

XML配置的bean是:

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

EmailServiceImpl类:

@Service 
public class EmailServiceImpl implements EmailService { 

    @Autowired 
    private JavaMailSenderImpl emailSender; 

    //more code.. 
} 

project_structure

回答

2

感谢大家的回应。我无法获得自动装配工作,但我得到了全面的电子邮件解决方案通过执行以下工作:在weblogic

  1. setup的邮件会话,用“myMailSession”

的JNDI名称增加的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> 

web.xml中添加:

<resource-ref> 
    <description>the email session</description> 
    <res-ref-name>myMailSession</res-ref-name> 
    <res-type>javax.mail.Session</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

添加到weblogic.xml中:

<resource-description> 
    <res-ref-name>myMailSession</res-ref-name> 
    <jndi-name>myMailSession</jndi-name> 
</resource-description> 

EmailServiceImpl:

@Service 
public class EmailServiceImpl implements EmailService { 

    private JavaMailSender mailSender; 

    public void setMailSender(JavaMailSender mailSender) { 
     this.mailSender = mailSender; 
    } 
    //..other code 
} 
+0

我遇到了同样的问题,并且在xml中配置时一切正常。从服务bean emailServiceImpl中删除autowired和@service注释。自动装配在其他豆类中工作正常。我想知道JavaMail中的自动装配有什么问题。 – 2016-01-26 14:38:49

1

您需要添加<context:annotation-config/>到您的配置文件,来让Spring自动装配注解豆。

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config

+0

我试过了,它给出了同样的错误。我会将其添加回原始帖子。任何其他想法? – flynfish 2011-12-27 17:59:45

+0

还有两件事你可以尝试。在xml中添加另一行以指定扫描您的bean的位置\t 并尝试在电子邮件发件人bean上将autowire-candidate属性设置为true。 – Travis 2011-12-27 18:03:49

+0

我能够重现您的错误,组件扫描应该可以解决您的问题。 – Travis 2011-12-27 18:21:30

1

从错误信息,我可以断定,自动装配工作,但它无法找到所需的豆。

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

1

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

1

这是我如何固定它:

我就遇到了这个问题也一样,我试图按照简单教程通过手动加载app-context.xml文件,在测试期间完美工作的在线,但是当我试图运行我的弹簧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配置文件移到了root配置文件的底部。

<context:annotation-config/>   
<context:component-scan base-package="my.app.service.layer"/> 

我还在学习Spring,但我在考虑他们出现的顺序有问题。

编辑: 这个问题似乎澄清与秩序问题:

Difference between applicationContext.xml and spring-servlet.xml in Spring Framework

4

我与这对电子邮件服务类非常问题所困扰编码,如:

@Service("emailService") 
public class EmailService { 
    @Autowired private JavaMailSenderImpl mailSender; 
    ... 
    public void send(...) { 
    // send logic 
    } 
} 

stumbled跨解决方案,同时阅读有关的相关话题。关键是JavaMailSender接口在applicationContext.xml中定义为Spring JavaMailSenderImpl类。

第1步:应用程序上下文文件进行了修改,包括下面bean定义:

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

步骤2:电子邮件服务类进行了修改,看起来像:

@Service("emailService") 
public class EmailService { 
    @Autowired private JavaMailSender mailSender; // Observe the change in the type 
    ... 

瞧!春天很开心。我想虽然喜欢听到原始错误的正确解释。