Skip to content

Unable to deserailize Seq with AS_EMPTY null handling #462

@nick-benoit14

Description

@nick-benoit14

Configuring jackson to treat null collections as empty appears to work for java.util collections, but fails for scala collections like Seq

package com.centricient.service.bot

import java.util

import com.centricient.service.bot.JacksonTest.{D, E}
import com.fasterxml.jackson.annotation.{JsonSetter, Nulls}
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import org.junit.runner.RunWith
import org.scalatest.{BeforeAndAfter, FlatSpec, Matchers}
import org.scalatest.junit.JUnitRunner

import scala.collection.mutable


object JacksonTest {
  case class D(s: util.ArrayList[String])
  case class E(s: Seq[String])
}


@RunWith(classOf[JUnitRunner])
class JacksonTest extends FlatSpec with BeforeAndAfter with  Matchers {

  val mapper = new ObjectMapper()
  mapper.registerModule(new DefaultScalaModule());
  mapper.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));

  it should "do stuff" in {

    val result1 = mapper.readValue("{\"s\": null}", classOf[D]) // Yields => D([])

    // Fails
    // com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot create empty instance of [collection-like type; class scala.collection.Seq, contains [simple type, class java.lang.String]], no default Creator
    // at [Source: (String)"{"s": null}"; line: 1, column: 7] (through reference chain: com.centricient.service.bot.JacksonTest$E["s"])
    val result2 = mapper.readValue("{\"s\": null}", classOf[E])

  }
}

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions