读取nacos中配置的json文件转到Java中的Map
现在有一个场景比如一些json的字典配置原先是在代码中或者是在代码目录下的,如果每次每次修改都需要重新打包代码,费劲。现在把配置文件的内容放到nacos中去。

如何在代码中读取并放到Map中直接用呢????
第一步:修改bootstrap.yml

第二步:增加一个service或者component或者是config都行。
@Service
public class JsonConfigHolder {
private final NacosConfigManager nacosConfigManager;
private final ObjectMapper objectMapper;
private final String dataId = "test.json";
private final String group = "DEFAULT_GROUP";
private final AtomicReference<Map<String, Object>> cache =
new AtomicReference<>(Collections.emptyMap());
public JsonConfigHolder(NacosConfigManager nacosConfigManager, ObjectMapper objectMapper) {
this.nacosConfigManager = nacosConfigManager;
this.objectMapper = objectMapper;
}
@PostConstruct
public void init() throws NacosException {
loadOnce();
addListener();
}
public Map<String, Object> getAll() {
Map<String, Object> m = cache.get();
return m == null ? Collections.emptyMap() : Collections.unmodifiableMap(m);
}
private void loadOnce() throws NacosException {
String content = nacosConfigManager.getConfigService().getConfig(dataId, group, 3000);
updateCache(content);
}
private void addListener() throws NacosException {
ConfigService cs = nacosConfigManager.getConfigService();
cs.addListener(dataId, group, new Listener() {
@Override public Executor getExecutor() { return null; }
@Override public void receiveConfigInfo(String content) {
updateCache(content);
}
});
}
private void updateCache(String content) {
try {
if (content == null || content.trim().isEmpty()) {
cache.set(Collections.emptyMap());
return;
}
Map<String, Object> map = objectMapper.readValue(
content, new TypeReference<Map<String, Object>>() {});
cache.set(map);
} catch (Exception e) {
// 可加日志
}
}
}
此时cache.get()获取的就是map的值。