Jasypt 3.x 兼容问题需用 jasypt-spring-boot-starter 3.x(严格匹配 Spring Boot 版本),删手动配置类,环境变量必须为全大写 JASYPT_ENCRYPTOR_PASSWORD,算法需显式设为 PBEWITHHMACSHA512ANDAES_256,并确保 Jakarta EE 9+ 包名兼容。

Java项目启动时提示 java.lang.ClassNotFoundException: org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig
这是 Jasypt 3.x 版本移除了旧配置类导致的典型兼容问题。你用了新版本依赖,但配置方式还照着老教程写。
- 确认你引入的是
jasypt-spring-boot-starter(推荐),不是原始的jasypt纯加密库 - Spring Boot 2.4+ 项目必须用
jasypt-spring-boot-starter3.x,对应 Spring Boot 版本号要严格匹配(如 3.0.x 对应 SB 3.0.x) - 删掉所有手动 new
EnvironmentStringPBEConfig或StandardPBEStringEncryptor的 Java 配置类——starter 已自动装配 - 如果你硬要用原生 Jasypt,得降级到 2.1.2 并手动注册 Bean,但不建议
application.yml 中的 JASYPT_ENCRYPTOR_PASSWORD 不生效
环境变量名写错、加载时机不对、或被其他配置覆盖,都会让密码“看起来没用”。Jasypt 默认只认这个变量名,且必须在 Spring Environment 初始化前就存在。
- 确保变量名是全大写:
JASYPT_ENCRYPTOR_PASSWORD,不是jasypt.encryptor.password或其他变体 - 不要在
application.yml里写jasypt: encryptor: password: xxx—— 这会被忽略,starter 只读环境变量或 JVM 参数 - 本地开发用
-Djasypt.encryptor.password=xxx启动更可靠;Docker 中用environment:块注入,别用env_file(加载顺序可能滞后) - 如果用了 Spring Profiles(如
spring.profiles.active=prod),确保加密值放在对应 profile 的配置里,而不是application.yml根层
数据库密码字段解密失败,报 EncryptionOperationNotPossibleException
这不是密钥错了,而是加密/解密使用的算法、盐、迭代次数不一致。常见于:用命令行工具加密时参数和运行时 starter 默认值对不上。
- 默认算法是
PBEWithMD5AndDES(弱,仅用于兼容),但 JDK 17+ 已禁用;生产必须显式指定更强算法,比如PBEWITHHMACSHA512ANDAES_256 - 在
application.yml加上:jasypt: encryptor: algorithm: PBEWITHHMACSHA512ANDAES_256 iv-generator-classname: org.jasypt.iv.RandomIvGenerator - 命令行加密时必须用相同参数:
java -cp jasypt-3.0.5.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="mydbpass" password=mypass algorithm=PBEWITHHMACSHA512ANDAES_256 - 注意:
input是你要加密的明文,password是上面设置的JASYPT_ENCRYPTOR_PASSWORD,二者不能混淆
Spring Boot 3 + Jakarta EE 9+ 下 Jasypt 解密后 DataSource 初始化失败
本质是包名迁移引发的反射失败。Jasypt 3.0.4+ 支持 Jakarta,但部分老 starter 封装没及时更新,导致 DataSource 创建时拿不到已解密的密码。
立即学习“Java免费学习笔记(深入)”;
- 检查依赖是否为
com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5(注意 groupId 是com.github.ulisesbocchio,不是org.jasypt) - 确认你的
spring-boot-starter-jdbc或spring-boot-starter-data-jpa是 3.x 版本,且使用jakarta.sql.DataSource接口 - 如果仍失败,在
@Configuration类中加一个@Bean手动构建HikariDataSource,把@Value("${spring.datasource.password}")注入进去——绕过自动配置链中可能断裂的一环 - 别用
@ConfigurationProperties直接绑定到自定义DataSourceProperties类,Jasypt 不会自动解密嵌套属性里的密码字段










