背景:springboot2 nacos2.0.x 版本
项目添加了mail依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
nacos中也有mail相关配置:
spring.mail.username=xx
spring.mail.password=xx
spring.mail.host=smtp.qq.com
但是项目还是报错:
Description:
A component required a bean of type 'org.springframework.mail.javamail.JavaMailSenderImpl' that could not be found.
Action:
Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSenderImpl' in your configuration
那么问题出现在哪里呢?这要从源码说起……
从springboot的尿性,呃,不,优秀特性,我们知道,自动装配要从AutoXXX类开始,而mail的自动配置在
MailSenderAutoConfiguration
,所以我们打开它:
@Configuration
@ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
@ConditionalOnMissingBean(MailSender.class)
@Conditional(MailSenderCondition.class) // 【1.看这里!!!】
@EnableConfigurationProperties(MailProperties.class) //【2.这里】
@Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class }) // 【3.这里】
public class MailSenderAutoConfiguration {
/**
* Condition to trigger the creation of a {@link MailSender}. This kicks in if either
* the host or jndi name property is set.
*/
static class MailSenderCondition extends AnyNestedCondition {
MailSenderCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION);
}
@ConditionalOnProperty(prefix = "spring.mail", name = "host") // 【1.1】
static class HostProperty {
}
@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name")
static class JndiNameProperty {
}
}
}
上面的点2处 和 我们的配置spring.mail.xxx绑定,这也是我上面 nacos mail配置的由来;
上面的点3处就是给我们创建
JavaMailSenderImpl
对象了,它使用到了点2处的
MailProperties
配置;
重点是上面的点1处,引申到上面的 【1.1】处,一句话:
你需要在application.yml/properties文件中额外配置spring.mail.host=xxxx
目前
不清楚
是不是因为springboot先加载上面的mail自动配置类,然后再加载nacos的原因,虽然我们在nacos中配置了
spring.mail.host=xxx
,但是由于优先级没能加载到,导致文章开头的报错,望大佬看到后解惑,
版权声明:本文为csdnfanguyinheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。