springboot2 nacos JavaMailSenderImpl not found

本文探讨了一起在SpringBoot2结合Nacos2.0.x版本时,邮件配置引发的错误。尽管在Nacos中配置了spring.mail相关属性,项目启动时仍报找不到JavaMailSenderImpl bean的错误。分析源码发现,问题可能出在SpringBoot的自动配置流程,即MailSenderAutoConfiguration类的加载顺序。该配置类依赖于在application.yml/properties文件中设置spring.mail.host属性,而Nacos配置可能未被优先读取。作者推测可能是加载顺序导致的问题,并期望得到专家解答。

背景: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,但是由于优先级没能加载到,导致文章开头的报错,望大佬看到后解惑,在这里插入图片描述

Spring Boot应用中连接Nacos 2.x版本,主要涉及服务注册与发现以及配置中心两个方面的实现。以下是详细的连接方法和配置步骤。 ### 服务注册与发现 要在Spring Boot应用中启用Nacos作为服务注册与发现机制,需要引入相应的依赖。对于Spring Boot 2.x版本,推荐使用Spring Cloud Alibaba来集成Nacos。 #### 添加依赖 在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.10.RELEASE</version> </dependency> ``` #### 配置Nacos服务地址 在`application.yml`文件中配置Nacos服务器的地址和其他相关参数: ```yaml server: port: 8080 spring: application: name: nacos-provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848 ``` 这里,`spring.cloud.nacos.discovery.server-addr`指定了Nacos服务器的地址和端口。确保该地址与Nacos服务器的实际运行地址一致。 #### 启用服务注册与发现 在主类或配置类上添加`@EnableDiscoveryClient`注解以启用服务注册与发现功能: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class NacosProviderApplication { public static void main(String[] args) { SpringApplication.run(NacosProviderApplication.class, args); } } ``` ### 配置中心 Nacos不仅可以作为服务注册与发现工具,还可以作为配置中心使用。通过配置中心,可以实现配置的集中管理和动态更新。 #### 添加依赖 在`pom.xml`文件中添加Nacos配置中心的依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.10.RELEASE</version> </dependency> ``` #### 配置Nacos配置中心 在`bootstrap.yml`文件中配置Nacos配置中心的相关信息: ```yaml spring: cloud: nacos: config: server-addr: 127.0.0.1:8848 file-extension: yaml namespace: your-namespace-id group: DEFAULT_GROUP ``` 这里,`spring.cloud.nacos.config.server-addr`指定了Nacos配置中心的地址,`file-extension`指定了配置文件的格式,`namespace`用于指定命名空间ID,`group`用于指定配置文件所在的组。 #### 使用配置 在Spring Boot应用中,可以通过`@Value`注解或`@ConfigurationProperties`注解来读取配置文件中的属性。例如: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class ConfigProperties { @Value("${example.config}") private String config; // Getter and Setter } ``` ### 注意事项 - **配置文件位置**:Nacos配置文件通常放在`bootstrap.yml`中,因为这些配置需要在应用启动早期加载。 - **命名空间**:如果Nacos服务器启用了命名空间功能,需要正确配置`namespace`参数。 - **组**:默认情况下,配置文件属于`DEFAULT_GROUP`组,如果使用了其他组,需要调整`group`参数。 - **动态刷新**:如果希望配置文件在Nacos中发生变化时能够自动刷新,可以在配置文件中添加`refresh: true`。 通过以上步骤,可以顺利地将Spring Boot应用连接到Nacos 2.x版本,并实现服务注册与发现以及配置中心的功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值