You need to enable JavaScript to run this app. 含Vavr List的Java对象Jackson序列化后反序列化失败问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

含Vavr List的Java对象Jackson序列化后反序列化失败问题咨询

错误原因
  • 默认Jackson ObjectMapper未适配Vavr类型,序列化时会把Vavr List的实例元属性(empty、lazy等)序列化输出,而非将集合内容序列化为标准JSON数组,生成的JSON结构不符合反序列化要求。
  • Vavr的io.vavr.collection.List属于抽象类型,没有公共默认构造方法,原生Jackson没有对应的反序列化规则,无法直接从JSON构造实例,因此抛出InvalidDefinitionException异常。
解决方案

方案1:使用官方Jackson Vavr适配模块(推荐)

这是侵入性最低、通用性最强的方案,仅需两步即可适配所有Vavr类型的序列化反序列化:

  1. 引入Vavr Jackson模块依赖(Maven示例):
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-vavr</artifactId>
    <version>请与项目内Jackson核心版本保持一致</version>
</dependency>
  1. 初始化ObjectMapper时注册VavrModule,修改后的测试代码如下:
@Test
public void mapperForVavrList() throws JsonProcessingException {
    Customer cus = Customer.builder().remarks(List.empty()).build();
    // 注册Vavr模块
    ObjectMapper objectMapper = new ObjectMapper()
      .registerModule(new VavrModule());
    ObjectWriter ow = objectMapper.writer().withDefaultPrettyPrinter();
    String json1 = ow.writeValueAsString(cus);
    log.info(json1);
    Customer cus2 = objectMapper.readValue(json1, Customer.class);
    log.info(cus2.toString());
}

适配后序列化得到的remarks字段会是标准JSON数组格式,可正常完成反序列化。

其他可选方案

  • 自定义序列化/反序列化器:给remarks字段添加@JsonSerialize、@JsonDeserialize注解,手动实现Vavr List和JSON结构的转换逻辑,仅适合项目内Vavr类型使用极少的场景。
  • 手动转换类型:序列化前调用Vavr List的toJavaList()方法转为JDK原生集合,反序列化后再手动转为Vavr List,该方式侵入性较高,需要修改业务逻辑或新增字段映射规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 22:36:03