alibaba / nacos

an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
https://nacos.io
Apache License 2.0
30.29k stars 12.84k forks source link

springboot整合nacos做配置中心,使用@NacosConfigurationProperties注解注入bean属性,当nacos客户端没有配置这个bean的属性,项目代码本地文件application.yml配置了,此时bean的属性并没有注入进来 #8226

Closed ShepherdZFJ closed 6 months ago

ShepherdZFJ commented 2 years ago

问题示例如下:

nacos客户端:没有配置要注入的bean属性

代码如下:

项目代码本地配置application.yml配置:

nacos:
  config:
    server-addr: 127.0.0.1:8848
    namespace: 6de43a50-61da-426a-9b2c-df474034c13d
    type: properties
    data-id: example.properties

user1:
  name: shepherd-local
  age: 18
  id: 127

注入如下:

@Data
@Component
@NacosConfigurationProperties(prefix = "user1", autoRefreshed = true, dataId = "example.properties")
//@ConfigurationProperties(prefix = "user1")
public class User {
    private String name;
    private Integer age;
    private Long id;
}

启动项目,查看user bean对象属性并没有注入成功。。。。。。

onewe commented 2 years ago

User 里面并没有 hello 属性呀

ShepherdZFJ commented 2 years ago

User 里面并没有 hello 属性呀

我并不是想注入hello属性,我是想注入user bean属性,截图1只是为了展示我在nacos客户端中没有配置user的属性,后面代码展示了我在项目代码的配置文件中配置user的属性,但是并没有成功注入,按道理如果nacos客户端没有配置user属性,但是本地配置文件配置了user属性,是不是应该成功注入?

KomachiSion commented 2 years ago

可能是对NacosConfigurationProperties注解的用法不对吧, 建议先用nacos-spring-boot-project里的example试一下对应功能。

ShepherdZFJ commented 2 years ago

可能是对NacosConfigurationProperties注解的用法不对吧, 建议先用nacos-spring-boot-project里的example试一下对应功能。

我个人理解@NacosConfigurationProperties对应@ConfigurationProperties,@NacosValue对应@value注解,当我们没有在nacos配置中心客户端配置相应属性时,这时候应该来读取项目本地文件application.yml,如果本地配置文件配置了,应该能成功注入属性,根据我自己的测试@NacosValue是可以成功注入本地文件配置的属性的,而@NacosConfigurationProperties却不能,所以感觉到疑惑,不知道这么理解对不对,也没有找到文档考证

KomachiSion commented 2 years ago

我感觉不对,至少@NacosValue对应value注解好像不是对应的。

KomachiSion commented 2 years ago

@hujun-w-2 can you help us?

hujun-w-2 commented 2 years ago

我看看这个问题

hujun-w-2 commented 2 years ago

@NacosConfigurationProperties与@NacosValue实现的方式不一样 @NacosConfigurationProperties是会从你配置的信息从配置中心获取内容,如果能获取到,再将bean进行赋值 @NacosValue 是先从配置中心获取值,放到environment中,然后设置值的时候是从environment中取,所以能取到本地配置值

ShepherdZFJ commented 2 years ago

@NacosConfigurationProperties与@NacosValue实现的方式不一样 @NacosConfigurationProperties是会从你配置的信息从配置中心获取内容,如果能获取到,再将bean进行赋值 @NacosValue 是先从配置中心获取值,放到environment中,然后设置值的时候是从environment中取,所以能取到本地配置值

我后面看源码实现,跟了一下,大概和你说的差不多🤝,但是这种实现是不是有点不妥?为啥这么搞

dujie-js commented 2 years ago

好像Springboot版本的依赖确实存在这个问题,spring cloud版本的我尝试应该是没问题

ShepherdZFJ commented 2 years ago

好像Springboot版本的依赖确实存在这个问题,spring cloud版本的我尝试应该是没问题

是的,貌似springboot版本整合的比较粗糙,spring cloud整合nacos使用spring cloud原生注解@RefreshScope就能实现动态刷新了,比较完美

quss commented 2 years ago

配置nacos配置中心在application.yml是不生效的,应该配置bootstrap.yml就会生效。在springboot初始化时,要先拉取配置中心,才能正常启动。加载配置文件顺序有先后顺序的bootstrap. *>application。 同springboot-config

ShepherdZFJ commented 2 years ago

配置nacos配置中心在application.yml是不生效的,应该配置bootstrap.yml就会生效。在springboot初始化时,要先拉取配置中心,才能正常启动。加载配置文件顺序有先后顺序的bootstrap. *>application。 同springboot-config

nacos的配置要写在bootstrap.yml是springcloud整合nacos的要求,springboot整合并不需要吧,这里探讨的是为什么@NacosConfigurationProperties只能读nacos客户端配置,不能读项目本地的application.yml的配置,但是@NacosValue却能两边都能读

dujie-js commented 2 years ago

@NacosValue 应该是从environment 获取的数据,应该是拉取数据的时候同步了environment,NacosConfigurationProperties这个没有深入了解过

ShepherdZFJ commented 2 years ago

@NacosValue 应该是从environment 获取的数据,应该是拉取数据的时候同步了environment,NacosConfigurationProperties这个没有深入了解过

后面跟代码发现@NacosConfigurationProperties会新增生成一个environment,并不是从Spring上下文获取环境变量environment,所以压根不会操作本地配置文件

dujie-js commented 2 years ago

@NacosValue 应该是从environment 获取的数据,应该是拉取数据的时候同步了environment,NacosConfigurationProperties这个没有深入了解过

后面跟代码发现@NacosConfigurationProperties会新增生成一个environment,并不是从Spring上下文获取环境变量environment,所以压根不会操作本地配置文件

那应该就是这里设计的问题,如果调整一下。NacosConfigurationProperties 默认也从本地和远端合并,同时在发布nacos动态配置的时候对environment 也进行数据调整是不是就能让他读取本地的文件了,不过这样的话可能这个组件不太支持 最难搞的是项目进行架构调整的时候注解都要修改nacos开通的相对来说有点难受

stale[bot] commented 1 year ago

Thanks for your feedback and contribution. But the issue/pull request has not had recent activity more than 180 days. This issue/pull request will be closed if no further activity occurs 7 days later. We may solve this issue in new version. So can you upgrade to newest version and retry? If there are still issues or want to contribute again. Please create new issue or pull request again.