学习nacos 动态配置@RefreshScope 标记的类中属性注入值为null

今天在学习使用Nacos,练习使用Nacos实现动态配置时遇到问题

在application.properties中定义了一个属性age

newAge=20

在nacos配置中心中新建配置jieyoumall-coupon.properties定义属性age

newAge=88

在controller中获取age属性并返回

@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${newAge}")
    private String newAge;

    @RequestMapping("/test")
    private R test(){
        return R.ok().put("age",newAge);
    }
}

此时前台请求接口 结果如图

这说明如果本地配置文件中的变量和Nacos中的变量重名,会取Nacos中的值

此时如果我们想修改Nacos中的变量值,实现同步更新(以前需要重新修改配置文件中的变量值,停止当前应用,重新发布,非常麻烦)

有了Nacos,则可以实现实时更新

直接修改Nacos中的值,在需要获取值的类加上@RefreshScope注解,可实现动态更新

@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${newAge}")
    private String newAge;

    @RequestMapping("/test")
    private R test(){
        System.out.println(newAge);
        return R.ok().put("age",newAge);
    }
}

但是!执行请求后,页面显示的结果却

非常奇怪!我检查了自己的配置

bootstrap.peoperties

spring.application.name=jieyoumall-coupon

spring.cloud.nacos.config.server-addr=127.0.0.1:8848

nacos 客户端 

nacos 服务端 1.3.2

SpringCloud Alibaba 2.2.3

SpringCloud SR8

SpringBoot 2.3.2

在网上查了版本之前的关系

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

更换了多次版本,并没有起作用,搜索了很多,但都没用

最后找了了一篇对我有用的文章,他说造成这种情况的原因是

这个注解的proxyMode默认值是ScopedProxyMode.TARGET_CLASS,这个代理

模式使用的是CGLIB方式。如果@RefreshScope使用在@Controller(不止这一个)标记的类上就会出现注入null值的问题。@RefreshScope只要是用在其他会被spring使用CGLIB代理的类上就会出问题。原因是@RefreshScope默认使用CGLIB代理,而目标类又是被CGLIB代理过的,这样就被代理了两次,第二次也就是@RefreshScope代理的时候会出现属性丢失的问题

 

解决方案:

@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)

问题解决!

 

原文链接:http://www.ifx666.cn/index/article/fb7361aa4d134b0ea8c7621641a4f06b.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值