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

如何检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:09:21