无法自动装配org.springframework.mail.javamail.JavaMailSender

Aes*_*eir 19 java spring spring-mvc

尝试运行我的应用程序时出现以下问题.调试了一切,但仍然没有.

IDE正在寻找没有任何问题的bean,所以我对这里发生的事情感到非常困惑.

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mailManager': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.testmail.app.service.implement.CustomMManagerService.setMailSender(org.springframework.mail.javamail.JavaMailSender); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying 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: {}
Run Code Online (Sandbox Code Playgroud)

我的bean生成位于以下文件中:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.testmail.app")
public class WebConfig extends WebMvcConfigurerAdapter {
 //CODE CODE CODE

    @Bean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setProtocol("SMTP");
        javaMailSender.setHost("127.0.0.1");
        javaMailSender.setPort(25);

        return javaMailSender;
    }

// CODE CODE CODE
}
Run Code Online (Sandbox Code Playgroud)

CustomMManager的代码:

public interface CustomMManager extends Serializable {
    void sendMail(String mailFrom,String mailTo,String subject,String mailBody);
}
Run Code Online (Sandbox Code Playgroud)

最后是CustomMManagerService的代码:

@Service("mailManager")
public class CustomMManagerService implements CustomMManager {
    private JavaMailSender mailSender;

    @Autowired
    public void setMailSender(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    @Override
    public void sendMail(final String mailFrom, final String mailTo, final String subject, final String mailBody) {
        try {
            mailSender.send(new MimeMessagePreparator() {
                public void prepare(MimeMessage mimeMessage)
                        throws Exception {
                    MimeMessageHelper message = new MimeMessageHelper(mimeMessage,
                            false, "UTF-8");
                    message.setFrom(mailFrom);
                    message.addTo(mailTo);
                    message.setSubject(subject);
                    message.setText(mailBody, true);
                }
            });
        } catch (MailSendException e) {
            // your codes;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助.

小智 53

您可能忘记设置以下属性:

spring.mail.host
spring.mail.username
spring.mail.password
spring.mail.port
Run Code Online (Sandbox Code Playgroud)

  • 有用。但错误消息毫无用处。它只是说找不到 bean,但没有说明原因,尽管每当平台尝试创建 bean 时应该很容易抛出有关缺少参数的错误。 (2认同)

Aes*_*eir 9

根据mserioli的评论,答案是必须在root用户调用的配置文件中声明bean.

在这种情况下:移动

@Bean
    public JavaMailSenderImpl mailSender() 
Run Code Online (Sandbox Code Playgroud)

public class ExtraConfig {
@Bean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setProtocol("SMTP");
        javaMailSender.setHost("127.0.0.1");
        javaMailSender.setPort(25);

        return javaMailSender;
    }
}
Run Code Online (Sandbox Code Playgroud)

这被称为:

@Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{ExtraConfig.class};
    }
Run Code Online (Sandbox Code Playgroud)

从而解决了这个问题.谢谢你的帮助.

  • 我认为JavaMailSenderImpl的重点在于它可以读取spring.mail.xxx属性.在此示例中,所有属性都在JavaMailSender上设置.即使它有效,这个解决方案最多也是令人困惑的. (5认同)

小智 8

  1. 检查application.properties配置,例如:

    spring.mail.host=smtp.xxx.com
    spring.mail.username=xxx@xxx.com
    spring.mail.password=xxxxx
    spring.mail.properties.mail.smtp.auth=true
    spring.mail.properties.mail.smtp.starttls.enable=true
    spring.mail.properties.mail.smtp.starttls.required=true
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果使用spring-boot,可以检查是否应该使用@EnableAutoConfiguration这个注释


Wal*_*tes 8

创建 Bean 时不要忘记指定邮件属性,使用 Java 类或在 application.properties 文件中,例如

# configuration email
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=email
spring.mail.password=password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
Run Code Online (Sandbox Code Playgroud)


dtr*_*unk 8

如前所述,您至少需要spring.mail.host在应用程序属性中进行设置。Spring Boot 自动配置仅JavaMailSender在设置了属性的情况下创建 bean:https ://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java /org/springframework/boot/autoconfigure/mail/MailSenderPropertiesConfiguration.java#L38


小智 7

如果您使用application.yml而不是application.properties用于配置,请仔细检查您的缩进(YAML 中的结构由缩进确定

在你的情况下mail:应该spring:像这样:

spring:
  datasource:
    password: root
    url: jdbc:mysql://127.0.0.1:3306/YOU_DATABASE?useSSL=false
    username: root
  mail:
      host: localhost
      port: 1025
      username: 
      password: 

      properties:
        mail:
          smtp:
            ssl:
              trust: "*"
            auth: true
            starttls:
              enable: true
            connectiontimeout: 5000
            timeout: 3000
            writetimeout: 5000
Run Code Online (Sandbox Code Playgroud)