Nacos读取json配置信息无法使用ConfigService

本文解决了一个关于Nacos中@NacosInjected无法正确获取ConfigService的问题。通过深入研究源码,作者发现ConfigService未被Spring托管,最终通过NacosConfigManager成功注入并获取JSON数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写自定义目录标题


Nacos 使用 @NacosInjected无法获取到 ConfigService,访问接口时提示该注入类为null,导致我无法通过她的
String getConfig(String dataId, String group, long timeoutMs) throws NacosException;
这个方法获取json数据,

在这里插入图片描述

在这里插入图片描述
这是有问题的代码,看了十多分钟,最后翻开源码
可以清楚的看到这张图的类对象并没有让spring托管
在这里插入图片描述
根据启动时的debug找到了configService的父类工厂类,从工厂类上追到nacos本身的配置启动类,发现配置管理类加上了@bean,说明只有通过她NacosConfigManager才能注入,
在这里插入图片描述
可以看到下图这里是我直接从spring取了NacosConfigManager,这样就可以取到json了
在这里插入图片描述

Nacos 中获取配置使用 `Map` 承接,通常是指将 Nacos 配置中心中的键值对形式的配置读取到一个 Java 的 `Map` 数据结构中。以下是详细的实现步骤和代码示例: ### 实现步骤 1. **引入依赖**:确保项目中已经引入了 Nacos 的相关依赖。 2. **初始化 Nacos 配置管理器**:通过 Nacos 的 API 获取配置服务实例。 3. **读取配置**:指定配置的 Data ID 和 Group,从 Nacos 中拉取配置内容。 4. **解析为 Map**:将配置内容(通常是字符串形式)解析为 `Map`。 以下是基于 Spring Boot 和 Nacos 的完整代码示例: ```java import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class NacosConfigLoader { private static final String SERVER_ADDR = "localhost:8848"; // Nacos服务器地址 private static final String DATA_ID = "example"; // 配置的Data ID private static final String GROUP = "DEFAULT_GROUP"; // 配置的Group public static void main(String[] args) { try { // 初始化Nacos ConfigService ConfigService configService = NacosFactory.createConfigService(SERVER_ADDR); // 从Nacos获取配置内容 String config = configService.getConfig(DATA_ID, GROUP, 5000); // 将配置内容解析为Map Map<String, String> configMap = parseConfigToMap(config); // 输出Map内容 configMap.forEach((key, value) -> System.out.println(key + ": " + value)); } catch (NacosException e) { e.printStackTrace(); } } /** * 将配置内容解析为Map * * @param config 配置内容,格式为key=value的多行字符串 * @return 解析后的Map */ private static Map<String, String> parseConfigToMap(String config) { Map<String, String> map = new HashMap<>(); if (config == null || config.isEmpty()) { return map; } // 使用Properties类解析配置内容 Properties properties = new Properties(); try { properties.load(new java.io.StringReader(config)); } catch (Exception e) { e.printStackTrace(); } // 将Properties转换为Map properties.stringPropertyNames().forEach(key -> map.put(key, properties.getProperty(key))); return map; } } ``` ### 代码解释 1. **NacosFactory.createConfigService**: - 用于创建 Nacos 的 `ConfigService` 实例,该实例是与 Nacos 配置中心交互的核心对象。 - 参数 `SERVER_ADDR` 是 Nacos 服务器的地址,例如 `localhost:8848`。 2. **ConfigService.getConfig**: - 从 Nacos 中获取指定 Data ID 和 Group 的配置内容。 - 返回的是一个字符串,内容通常是键值对的形式(如 `key1=value1\nkey2=value2`)。 3. **parseConfigToMap 方法**: - 将配置内容(字符串形式)解析为 `Map<String, String>`。 - 使用 `Properties` 类加载配置内容,并将其键值对提取到 `Map` 中。 4. **输出结果**: - 遍历 `Map` 并打印所有键值对。 --- ### 注意事项 - 确保 Nacos 服务已启动,并且在 Nacos 控制台中添加了对应的配置(Data ID、Group 和内容)。 - 如果配置内容是 JSON 格式,则需要使用 JSON 解析库(如 Jackson 或 Gson)来解析。 --- ### 示例输出 假设 Nacos 中的配置内容如下: ``` name=John age=30 city=New York ``` 运行上述代码后,输出结果为: ``` name: John age: 30 city: New York ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值