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

使用Jackson Json Crypto结合Temporal Workflow时数据取回解密失败问题

问题分析与解决方案

核心问题

反序列化时@Encrypt注解未触发,加密后的JSON结构直接映射到字段,本质是Jackson的CryptoModule反序列化器没和注解字段绑定成功,导致默认的字段映射逻辑接管了处理。

注解工作机制与执行顺序

  1. Jackson注解生效逻辑:
    • 自定义模块(比如CryptoModule)通过注册专属的序列化/反序列化器,关联对应的注解。ObjectMapper处理POJO时,会先扫描字段注解,匹配到对应模块的处理器后,就会把字段的序列化/反序列化逻辑交给模块处理。
    • 对于@Encrypt:
      • 序列化阶段:先取字段原始值,交给加密模块生成包含salt/iv/value的加密结构,再输出JSON;
      • 反序列化阶段:先读取加密的JSON结构,交给模块解密成原始值,再赋值给字段。
  2. 执行顺序:@Encrypt的处理逻辑优先于ObjectMapper的默认字段映射——模块会拦截注解标记的字段,全程接管序列化/反序列化,不存在“先映射到POJO再解密”的情况。

修复方向

1. 确保Temporal使用的是已注册加密模块的ObjectMapper

Temporal内部会自己创建ObjectMapper实例,如果你只修改了自己的实例但没配置给Temporal,加密逻辑就不会生效。正确配置方式:

// 创建并配置带加密模块的ObjectMapper
ObjectMapper jacksonObjectMapper = JsonPayloadFormat.newDefaultObjectMapper();
EncryptionService encryptionService = new EncryptionService(jacksonObjectMapper, new PasswordCryptoContext("Password1"));
jacksonObjectMapper.registerModule(new CryptoModule().addEncryptionService(encryptionService));

// 让Temporal使用这个配置好的ObjectMapper
WorkflowServiceStubsOptions serviceOpts = WorkflowServiceStubsOptions.newBuilder()
    .setDataConverter(new JacksonJsonDataConverter(jacksonObjectMapper))
    .build();
WorkflowServiceStubs serviceStubs = WorkflowServiceStubs.newInstance(serviceOpts);

2. 检查注解与模块的兼容性

  • 确认导入的@Encrypt是CryptoModule提供的类,不要和其他库的同名注解混淆;
  • 检查Jackson版本和CryptoModule版本是否匹配,版本不兼容会导致注解无法被识别。

3. 验证反序列化器的注册

调试CryptoModule的findDeserializers方法,确认它为带@Encrypt的orderId字段返回了对应的反序列化器。如果没返回,说明模块初始化时没有正确绑定注解。

4. 确认加密上下文一致性

反序列化时使用的PasswordCryptoContext必须和序列化时完全一致(密钥、加密算法等),否则反序列化器可能静默失败,直接返回原始加密结构。

总结

问题根源在于加密模块的反序列化器没和注解字段绑定成功,重点排查Temporal的ObjectMapper配置、注解与模块的兼容性,以及加密上下文的一致性。

内容的提问来源于stack exchange,提问作者Rajat kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:30:09