1

There are some fields, which should be deserialized from String to Double. However, the general ObjectMapper configuration doesn't allow coercion of scalars: configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false)

Before Jackson coercion configuration feature implementation, this String -> Double conversion was done with a custom deserializer. For example:

data class SeriesFrameInputChannel(
    @JsonDeserialize(using = TestDeserializer::class)
    @JsonProperty("test_field")
    val testFieldForConvertion: Double
)

class TestDeserializer : StdDeserializer<Double>(Double::class.java) {
    override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Double {
        return _parseDoublePrimitive(p, ctxt)
    }
}

However, after the coercion config was introduced, the following error occurred:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot coerce String value ("2.2") to `double` value (but might if coercion using `CoercionConfig` was enabled)

The issue could be solved by adding the following lines to the ObjectMapper configuration:

coercionConfigFor(LogicalType.Integer)
   .setCoercion(CoercionInputShape.String, CoercionAction.TryConvert)

However, it will affect the deserialization behavior of other fields, not only testFieldForConvertion.

What is the appropriate way to apply Jackson coercion configuration to the specified field case(-s), in order to avoid the deserialization behavior changes for other fields?

user3856196
  • 349
  • 4
  • 16

0 Answers0