jasypt自定义加解密类导致NPE

文章讨论了SpringBoot项目中使用Jasypt加密配置文件时遇到的空指针异常(NPE),原因在于Starter自动配置和自定义bean的注入顺序。解决办法是自定义ApplicationContextInitializer提前注入加解密类,降低维护成本。
摘要由CSDN通过智能技术生成

        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,维护成本高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jasypt是一个流行的Java库,用于实现数据的加密和解密。它提供了各种算法和方法,可以满足不同场景中的自定义加解密需求。 要实现自定义加密,我们可以使用jasypt的`StringEncryptor`接口。首先,我们需要创建一个自定义的加密器,并实现`StringEncryptor`接口。在这个中,我们可以选择使用现有的加密算法,也可以编写自己的算法。 在加密器中,我们需要实现`encrypt`和`decrypt`方法。`encrypt`方法用于将输入的明文字符串加密,返回加密后的密文字符串。`decrypt`方法用于将密文字符串解密,返回解密后的明文字符串。 另外,为了提供加密所需的属性,我们可以创建一个配置,并在其中定义要使用的加密算法和密钥等属性。然后,我们可以将配置的实例作为参数传递给加密器的构造函数。 使用自定义加密时,我们可以在应用程序中使用这个自定义的加密器,调用其`encrypt`和`decrypt`方法来完成数据的加密和解密。 例如,我们可以创建一个自定义的加密器`MyEncryptor`,并实现`StringEncryptor`接口。在`encrypt`方法中,我们可以使用基于AES算法的加密库来加密输入的明文字符串。在`decrypt`方法中,我们使用同样的算法对密文字符串进行解密,得到明文字符串。 同时,我们创建一个配置`MyEncryptorConfig`,定义了要使用的加密算法和密钥等属性。 最后,我们在应用程序中使用`MyEncryptor`和`MyEncryptorConfig`的实例,调用其相应方法进行加密和解密操作。 总的来说,jasypt提供了丰富的功能和灵活性,使我们能够根据特定需求实现自定义加解密操作。它的使用方式简单直观,方便在Java应用程序中集成加解密功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值