springboot项目中引入jasypt,进行配置文件帐密的加密, 自定义了加解密的类,同时修改了nacos的账密为密文,当启动项目的时候出现了NPE。这是什么原因呢?
原因是starter和自定义bean的注入顺序问题:
在 Spring Boot Starter 中,如果自定义了配置 bean 并完成了 starter 注入,则在完成 starter 注入前是不会注入自定义 bean 的。 这是因为 Spring Boot Starter 的加载顺序是在自定义 bean 加载之前完成的。当应用程序启动时,Spring Boot 将扫描所有已加载的 Starter 模块并执行其自动配置逻辑。然后,在 Starter 自动配置逻辑执行完毕后,才会开始加载和实例化用户自定义的 bean。 因此,如果在 Starter 中自定义了配置 bean 并完成了 starter 注入,则在完成 starter 注入前不会注入自定义 bean。但是,在完成 starter 注入后,就可以正常访问自定义的 bean 了。
所以nacos读取配置文件的时候,被jasypt拦截,因为自定义的加解密类还未注入容器,这个时候去解密是会出现NPE的,解决方法有多种:
1. 自定义nacos, 修改都配置的方法
2. 取消加解密类的自动代理,自定义一个类实现ApplicationContextInitializer<ConfigurableApplicationContext>接口,在
initialize方法里面手动注入自定义的加解密类,提前注入自定义bean,同在在META-INF下的spring.factories下的
org.springframework.context.ApplicationContextInitializer
配置自定义加解密类,使之和starter处于相同优先级。
我们的方案是采用方法2,改造成本低;如果使用方法1需要定制nacos,维护成本高。