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

作者站长头像
站长
· 阅读数 6

在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:sdtfsldu239debug的时候是可以走到下面这里的,但是nacos上的却不行,应该是没有获取到配置中心的数据

 if (str.contains(DECRYPT_PREFIX)) {
    System.out.println(str);
   String v = str.substring(DECRYPT_PREFIX_LENGTH);
    replacedMap.put(name, "123456");
}
回复
1个回答
avatar
test
2024-07-12

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

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容