使用Jackson Json Crypto结合Temporal Workflow时数据取回解密失败问题
问题分析与解决方案
核心问题
反序列化时@Encrypt注解未触发,加密后的JSON结构直接映射到字段,本质是Jackson的CryptoModule反序列化器没和注解字段绑定成功,导致默认的字段映射逻辑接管了处理。
注解工作机制与执行顺序
- Jackson注解生效逻辑:
- 自定义模块(比如CryptoModule)通过注册专属的序列化/反序列化器,关联对应的注解。ObjectMapper处理POJO时,会先扫描字段注解,匹配到对应模块的处理器后,就会把字段的序列化/反序列化逻辑交给模块处理。
- 对于
@Encrypt:- 序列化阶段:先取字段原始值,交给加密模块生成包含salt/iv/value的加密结构,再输出JSON;
- 反序列化阶段:先读取加密的JSON结构,交给模块解密成原始值,再赋值给字段。
- 执行顺序:
@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
相关产品推荐
相关产品推荐

