含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类型的序列化反序列化:
- 引入Vavr Jackson模块依赖(Maven示例):
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-vavr</artifactId> <version>请与项目内Jackson核心版本保持一致</version> </dependency>
- 初始化
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
相关产品推荐
相关产品推荐

