如何检查ObjectMapper是否成功注册自定义序列化/反序列化器
如何校验ObjectMapper中自定义序列化/反序列化器是否注册成功
首先先修正你代码里的明显笔误:遍历序列化器集合时类名写为TestSerailizer,正确拼写应为TestSerializer,该问题会直接导致编译失败,修正后再做后续校验。
另外提前提醒:你当前代码中所有TestDeserializer都绑定到了Object.class类型,SimpleModule对同一类型重复添加反序列化器时,后添加的实例会覆盖之前的,最终只会生效最后一个注册的TestDeserializer,如果需要多个反序列化器处理不同类型,要在addDeserializer时传入对应绑定的类型,不要全部写Object.class。
以下是两种常用的校验方式:
1. 运行时读取注册元数据校验(直接确认注册状态)
ObjectMapper本身对外暴露了序列化、反序列化实例、已注册模块的查询接口,不需要引入额外依赖,直接编写代码即可校验:
import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.JsonDeserializer; import java.util.Map; // 注入你自定义配置的ObjectMapper实例 @Autowired private ObjectMapper objectMapper; @Autowired private List<TestSerializer> serializers; @Autowired private List<TestDeserializer> deserializers; public void validateRegisterStatus() { // 第一步:先确认自定义模块是否成功注册到ObjectMapper // 建议给你的自定义SimpleModule设置唯一名称,方便识别:customModule.setName("my-custom-jackson-module") boolean moduleLoaded = objectMapper.getRegisteredModuleIds().contains("my-custom-jackson-module"); System.out.printf("自定义模块加载状态:%s%n", moduleLoaded); // 第二步:校验自定义序列化器 Map<Class<?>, JsonSerializer<?>> registeredSerializers = objectMapper.getSerializerProviderInstance() .getRegisteredSerializers(); for (TestSerializer serializer : serializers) { Class<?> targetType = serializer.handledType(); boolean match = registeredSerializers.containsKey(targetType) && registeredSerializers.get(targetType).getClass().equals(serializer.getClass()); System.out.printf("处理类型[%s]的序列化器[%s] 注册状态:%s%n", targetType.getName(), serializer.getClass().getSimpleName(), match); } // 第三步:校验自定义反序列化器 Map<Class<?>, JsonDeserializer<?>> registeredDeserializers = objectMapper.getDeserializationConfig() .getDeserializers() .getAllDeserializers(); // 你当前所有反序列化器都绑定Object.class,直接查询该类型绑定的实例即可 JsonDeserializer<?> objDeserializer = registeredDeserializers.get(Object.class); System.out.printf("Object类型绑定的反序列化器实际类型:%s%n", objDeserializer == null ? "无" : objDeserializer.getClass().getSimpleName()); }
2. 功能逻辑验证(确认实际生效)
元数据校验只能证明实例注册成功,要确认序列化/反序列化逻辑确实按预期执行,最可靠的方式是编写测试用例直接做序列化、反序列化操作:
// 序列化测试:传入你的自定义序列化器对应的目标类型实例 TestTargetType testObj = new TestTargetType(); String serializeResult = objectMapper.writeValueAsString(testObj); // 比对serializeResult是否符合你自定义序列化器的输出规则,比如字段格式、特殊字段输出等 // 反序列化测试:传入测试JSON,解析为对应绑定类型 Object deserializeResult = objectMapper.readValue("{\"test\":\"value\"}", Object.class); // 比对deserializeResult是否符合你自定义反序列化器的解析逻辑
额外注意点
如果是Spring/SpringBoot环境,要确认你注入的ObjectMapper就是getMyObjectMapper方法生成的实例,避免Spring自动配置的默认ObjectMapper实例覆盖你的自定义配置,导致自定义模块不生效。
内容的提问来源于stack exchange,提问作者vikifor
相关产品推荐
相关产品推荐

