You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证实体类@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对照验证

    1. 先通过JPA的save方法插入一条TestUser数据,设置testKey为已知明文,比如"测试明文123",记录这条数据的id
    2. 直接用数据库客户端连接到对应的库,执行原生解密语句,用yml中配置的key作为解密参数:
      SELECT CAST(AES_DECRYPT(testKey, 'lasdfuiwfaskjgfahsgdfhasgdflwer8wezxnb612782rt') AS CHAR) AS decrypted_val FROM test_user WHERE id = 你插入的记录ID;
      
      如果查询结果和你存入的明文一致,说明加密时用的就是配置的key。
    3. 反过来验证读逻辑:你可以自己用原生SQL插入一条加密数据,用配置的key加密明文:
      INSERT INTO test_user (testKey) VALUES (AES_ENCRYPT('反向测试明文', 'lasdfuiwfaskjgfahsgdfhasgdflwer8wezxnb612782rt'));
      
      然后调用JPA的findById查询这条记录,如果实体类的testKey属性值为反向测试明文,说明读逻辑的密钥也正确。
  • 方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:27:03