springboot2 nacos JavaMailSenderImpl not found

  • Post author:
  • Post category:java


背景: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 版权协议,转载请附上原文出处链接和本声明。