天天看點

學習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 動态配置@RefreshScope 标記的類中屬性注入值為null

這說明如果本地配置檔案中的變量和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);
    }
}
           

但是!執行請求後,頁面顯示的結果卻

學習nacos 動态配置@RefreshScope 标記的類中屬性注入值為null

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

bootstrap.peoperties

spring.application.name=jieyoumall-coupon

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

nacos 用戶端 

學習nacos 動态配置@RefreshScope 标記的類中屬性注入值為null

nacos 服務端 1.3.2

SpringCloud Alibaba 2.2.3

SpringCloud SR8

SpringBoot 2.3.2

在網上查了版本之前的關系

學習nacos 動态配置@RefreshScope 标記的類中屬性注入值為null

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

學習nacos 動态配置@RefreshScope 标記的類中屬性注入值為null

更換了多次版本,并沒有起作用,搜尋了很多,但都沒用

最後找了了一篇對我有用的文章,他說造成這種情況的原因是

這個注解的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