springboot中使用EnvironmentPostProcessor获取不到nacos上的配置信息?

在springboot2.6版本中使用EnvironmentPostProcessor 对properties文件中的加密数据进行解密操作,但是properties是配置在nacos配置中心的,启动服务时获取不到nacos上的数据,

public class DecryptProcessor implements EnvironmentPostProcessor {
    private Logger logger = LoggerFactory.getLogger(DecryptProcessor.class);
    /**
     * 加密的属性的前缀:DEC + 密文 
     */
    private final static String DECRYPT_PREFIX = "DEC:";
    private final static int DECRYPT_PREFIX_LENGTH = DECRYPT_PREFIX.length();

    /**
     * 替换过的resource的name
     */
    private static final String DECRYPT_RESOURCE_NAME = "decryptResource";
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        MutablePropertySources propertySources = environment.getPropertySources();
        Map<String, Object> replacedMap = new HashMap<>();
        for (PropertySource<?> propertySource : propertySources) {
            if (propertySource instanceof OriginTrackedMapPropertySource) {
                OriginTrackedMapPropertySource source = (OriginTrackedMapPropertySource) propertySource;
                for (String name : source.getPropertyNames()) {
                    Object value = source.getProperty(name);
                    if (value instanceof String) {
                        String str = (String) value;
                        if (str.contains(DECRYPT_PREFIX)) {
                            System.out.println(str);
                           String v = str.substring(DECRYPT_PREFIX_LENGTH);
                            replacedMap.put(name, "123456");
                        }
                    }
                }
            }
        }
        if (!replacedMap.isEmpty()) {
            logger.info("{} decrypt properties  has replace !", replacedMap.size());
            propertySources.addFirst(new MapPropertySource(DECRYPT_RESOURCE_NAME, replacedMap));
        }

    }
META-INF/spring.factories中配置:
org.springframework.boot.env.EnvironmentPostProcessor=pers.vic.boot.base.tool.evn.DecryptProcessor 

我在服务本地的resource目录下的application.properties中配置了一条测试数据,
test.password=DEC:sdtfsldu239
debug的时候是可以走到下面这里的,但是nacos上的却不行,应该是没有获取到配置中心的数据

 if (str.contains(DECRYPT_PREFIX)) {
    System.out.println(str);
   String v = str.substring(DECRYPT_PREFIX_LENGTH);
    replacedMap.put(name, "123456");
}
阅读 4.2k
1 个回答

debug走了下,走到EnvironmentPostProcessor的时候,都还没去获取nacos的数据,所以你想用这种方式去实现解密肯定是翻车的,applicationContextInitializer这个倒是还挺不错,回调时机在读取nacos数据后,
image.png
第二个问题就是你这获取配置的代码,是只能处理配置文件,bootstrap解析完生成的其实是BootstrapPropertySource,这里你得兼容,用不用nacos这是需要处理的
image.png
然后是bootstrap启动配置
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题