如何验证实体类@ColumnTransformer中SPEL引用的application.yml密钥生效
验证方案
方法1:先验证配置类绑定是否正确
写单元测试确认ConfigurationHolder已经正确加载到yml中的配置值:@SpringBootTest class ConfigTest { @Autowired private ConfigurationHolder configurationHolder; @Test void testKeyLoad() { // 断言配置值和yml中配置的一致 org.junit.jupiter.api.Assertions.assertEquals("lasdfuiwfaskjgfahsgdfhasgdflwer8wezxnb612782rt", configurationHolder.getKey()); } }这一步是基础,如果配置类本身都没拿到正确值,后续逻辑肯定不对。
方法2:数据库原生SQL对照验证
- 先通过JPA的save方法插入一条
TestUser数据,设置testKey为已知明文,比如"测试明文123",记录这条数据的id - 直接用数据库客户端连接到对应的库,执行原生解密语句,用yml中配置的key作为解密参数:
如果查询结果和你存入的明文一致,说明加密时用的就是配置的key。SELECT CAST(AES_DECRYPT(testKey, 'lasdfuiwfaskjgfahsgdfhasgdflwer8wezxnb612782rt') AS CHAR) AS decrypted_val FROM test_user WHERE id = 你插入的记录ID; - 反过来验证读逻辑:你可以自己用原生SQL插入一条加密数据,用配置的key加密明文:
然后调用JPA的findById查询这条记录,如果实体类的INSERT INTO test_user (testKey) VALUES (AES_ENCRYPT('反向测试明文', 'lasdfuiwfaskjgfahsgdfhasgdflwer8wezxnb612782rt'));testKey属性值为反向测试明文,说明读逻辑的密钥也正确。
- 先通过JPA的save方法插入一条
方法3:打印JPA执行的实际SQL确认
在application.yml中添加以下配置开启SQL打印:spring: jpa: show-sql: true properties: hibernate: format_sql: true logging: level: org.hibernate: SQL: debug type.descriptor.sql: trace启动项目执行增查操作,观察控制台打印的SQL语句,
@ColumnTransformer中的SPEL会在Hibernate初始化注解时就被解析为实际值,所以你会看到SQL里AES_DECRYPT和AES_ENCRYPT的密钥参数直接就是你yml中配置的字符串,能直观确认是否正确。方法4:对照变量测试
把application.yml中的myapp.key改成其他任意值,重启项目之后,之前用旧密钥加密的数据查出来会是乱码,说明密钥确实是读取的yml配置,会跟随配置变动。
注:Hibernate的
@ColumnTransformer默认不支持Spring SPEL解析,如果以上验证发现密钥没有被正确替换,你需要额外配置Hibernate的变量解析器来支持Spring上下文的SPEL解析。
内容的提问来源于stack exchange,提问作者Sony
相关产品推荐
相关产品推荐

