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");
}
回复
1个回答

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

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