SpringBoot项目common模块中用到了Spring表达式导致的问题

【前置条件】

SpringBoot项目,项目分为十几个module,其中common是其中一个module,common模块用来存放常量类、枚举、工具类,以及所有的dao。

至于这里为什么要存放所有的dao,是因为项目并没有采用springcloud,无法做到服务间调用,所以为了让一些公共的接口不冗余,将dao层统一放在common模块中,各个服务各自注入common模块的dao从而各自实现service层。当然,各个服务的service层的冗余还是不可避免。

【问题描述】

项目开发中遇到问题,在A模块的配置文件application.yml中新增了一个配置项,该配置项以Spring表达式的方式用在了common模块中。

结果就会导致:引用了common模块的其他模块也识别到了该Spring表达式,导致启动报错,提示找不到该配置。

A模块application.yml的配置如下:

common模块中的Spring表达式如下:

更正一下:

假设有个其他模块--模块B。

并不是模块B引用了common模块,就会在启动报错。而是因为模块B的启动类中的@SpringBootApplication注解配置了scanBasePackages属性,该属性的值等于common模块的package。

模块B的启动类注解如下: (假设common模块的package路径就是com.aaa.bbb)

那为什么项目中要把其他模块的scanBasePackages 的值都配置成 common模块的package路径呢?

是因为要用到common模块中的dao对象。如果不配置成common模块的package路径,那就无法扫描到common模块中的dao,也就无法在各自模块中注入这些dao了。

所以才有了模块B在启动时会报错,如下图所示:

当然,如果模块B不需要用到common模块中的dao对象或者其他bean对象,那么模块B的@SpringBootApplication的属性scanBasePackage就不需要配置成common模块的package了。

这样的话,模块B在启动时也不会报错。因为模块B根本扫描不到common模块的package里。

Like this:

【解决方案】

当然肯定不能以 【在其他模块中都增加该配置项】的方式来解决,这样配置项就十分冗余了。

我们可以这样处理:在common模块中用到了该配置项的类,去实现 InitializingBean 接口,并重载该接口的 afterPropertiesSet() 方法,在该方法中用 Environment 去获取配置文件的属性。

以这样的方式,有该配置项的服务可获取到值;无该配置项的服务也不会在启动时报错了。

如下图所示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓不利东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值