In my @JsonTest, the autowired ObjectMapper ignores my @Configuration.
Using full @SpringBootTest instead avoids the problem.
This defeats the purpose of @JsonTest.
Various older posts on StackOverflow seem to imply it has worked correctly in the past. I am using spring-boot-starter-parent 2.7.2 with Kotlin and jackson-module-kotlin
My test:
@JsonTest
internal class JacksonConfigTest : FreeSpec() {
override fun extensions() = listOf(SpringExtension)
@Autowired
private lateinit var objectMapper: ObjectMapper
init {
"Reads null list as empty list" {
val src = """
{
"listField": null
}
""".trimIndent()
val parsed = objectMapper.readValue(src, DummyClass::class.java)
parsed.listField shouldNotBe null
parsed.listField should beEmpty()
}
}
}
class DummyClass(
val listField: List<String> = emptyList()
)
My config:
@Configuration
class JacksonConfig {
@Bean
fun objectMapper(): ObjectMapper {
return JsonMapper.builder()
.addModule(
KotlinModule.Builder()
.enable(KotlinFeature.StrictNullChecks)
.enable(KotlinFeature.NullToEmptyCollection)
.build()
)
.addModule(JavaTimeModule())
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.serializationInclusion(JsonInclude.Include.NON_NULL)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.build()
}
}
Comment From: wilkinsona
This is working as designed. As described in the documentation, if you want JacksonConfig to be applied you should @Import it.