zl程序教程

您现在的位置是:首页 >  Java

当前栏目

yml找不到与mail注入问题分析

2023-02-18 16:42:22 时间

    今天没有按计划完成任务,原因是~有个新的游戏公测了,没忍住QAQ

    另外一个重要问题是,两个bug的产生,如下阐述。

yml文件没有小绿叶

    我的后端springboot是采用的yml以及application杂糅的方式进行配置的,之前每天正常的跑着,可是今天打开idea时候,yml一直没有自动提示,yml文件没有染上spring的颜色,网上大部分都是一样的解决策略,那就是安装spring assistant插件,然后重启即可,然而事实上不奏效。经过我的慢慢琢磨,解决措施如下:

手动的将yml加入到环境,而不是自动扫描[可能是项目变大,扫描变得困难,没扫到]。

mail注入

    说到springboot,那么他提供了一个JavaMailSender . 只要导入对应的spring-boot-starter-mail并且进行基本项的配置即可。需要时,自动注入JavaMailSender,利用SimpleMailMessage封装一下消息即可发送。但是事实上并没有这么顺利,一开始我的配置全部放在了yml中,结果发现JavaMailSender始终找不到!用了各种方法都不行。最后解决措施是把spring.mail.host放在application.properties即可。。。大致分析一下原因(不一定正确,但大概率是):

    首先大致查看了MailSenderAutoConfiguration的源码,类前有下面这句话:

@Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })

    这个导入中,后面一个MailSenderPropertiesConfiguration就是会产生JavaMailSender对象的类,它的类上有标注:

@ConditionalOnProperty(prefix = "spring.mail", name = "host")

    而对于其内部有JavaMailSender对象产生方式:

	@Bean
	@ConditionalOnMissingBean(JavaMailSender.class)
	JavaMailSenderImpl mailSender(MailProperties properties) {
		JavaMailSenderImpl sender = new JavaMailSenderImpl();
		applyProperties(properties, sender);
		return sender;
	}

    由此可见,如果成功进入了MailSenderPropertiesConfiguration类,那么一定会产生JavaMailSender或者是容器原本就存在的实例。所以原因就是没有进入。然而我仔细排查我的yml文件,发现该配置是绝对存在的,所以真相只有一个,那就是ConditionalOnProperty的判定并没有访问到yml的配置,只访问了application的配置。

    浅显的原因就是这个结论了ConditionalOnProperty不读取yml配置。深层原因肯定还是要去看spring对这个注解的处理方式了。因为较为繁琐,暂且只做简单的分析,日后有空的时候再进行深入分析。

后续

    主要就是解决了上面的问题,然后就是简单的回复发送邮件提醒被回复人了(不会有人会经常逛你站看有没有人来回复评论的,所以,需要邮件提醒)。然后由于发送邮件需要的时间比较长,所以暂且也是新建了一个线程单独处理,服务本身只检测插入数据库的结果,当然,没有必要上消息队列的,因为处理量没那么大。然后前端还实现了昨天计划的评论后刷新策略,简单的实现了子传父事件方式,成功时,就重新获取一下数据(因为数据量不是很大,这样更方便)。

    明天要做核酸检测啦。明天总能把友链页剩余的两个需求解决了吧!管理友链和评论分页。

    开心!o(* ̄▽ ̄*)ブ