读取nacos中配置的json文件转到Java中的Map

读取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的值。