Skip to content

Commit 407efde

Browse files
committed
issue when fields have default values (#600)
1 parent 1dbd89d commit 407efde

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

src/main/scala/tools/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala

+15-8
Original file line numberDiff line numberDiff line change
@@ -214,23 +214,22 @@ class ScalaAnnotationIntrospectorInstance(scalaAnnotationIntrospectorModule: Sca
214214
// Locate the constructor param that matches it
215215
descriptor.properties.find(_.param.exists(_.index == creator.getCreatorIndex)) match {
216216
case Some(pd) => {
217-
val mappedCreator = overrides.get(pd.name) match {
218-
case Some(refHolder) => WrappedCreatorProperty(creator, refHolder)
219-
case _ => creator
220-
}
221217
if (applyDefaultValues) {
222218
pd match {
223219
case PropertyDescriptor(_, Some(ConstructorParameter(_, _, Some(defaultValue))), _, _, _, _, _) => {
224-
mappedCreator.withNullProvider(new NullValueProvider {
220+
val updatedCreator = creator.withNullProvider(new NullValueProvider {
225221
override def getNullValue(ctxt: DeserializationContext): AnyRef = defaultValue()
226-
227222
override def getNullAccessPattern: AccessPattern = AccessPattern.DYNAMIC
228223
})
224+
updatedCreator match {
225+
case cp: CreatorProperty => applyOverrides(cp, pd.name, overrides)
226+
case cp => cp
227+
}
229228
}
230-
case _ => mappedCreator
229+
case _ => applyOverrides(creator, pd.name, overrides)
231230
}
232231
} else {
233-
mappedCreator
232+
applyOverrides(creator, pd.name, overrides)
234233
}
235234
}
236235
case _ => creator
@@ -246,6 +245,14 @@ class ScalaAnnotationIntrospectorInstance(scalaAnnotationIntrospectorModule: Sca
246245
override def getFromObjectArguments(config: DeserializationConfig): Array[SettableBeanProperty] = {
247246
overriddenConstructorArguments
248247
}
248+
249+
private def applyOverrides(creator: CreatorProperty, propertyName: String,
250+
overrides: Map[String, ClassHolder]): CreatorProperty = {
251+
overrides.get(propertyName) match {
252+
case Some(refHolder) => WrappedCreatorProperty(creator, refHolder)
253+
case _ => creator
254+
}
255+
}
249256
}
250257
}
251258

src/test/scala/tools/jackson/module/scala/deser/OptionWithNumberDeserializerTest.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ class OptionWithNumberDeserializerTest extends DeserializerTest {
5555
it should "deserialize OptionLongWithDefault when registerReferencedValueType is used" in {
5656
ScalaAnnotationIntrospectorModule.registerReferencedValueType(classOf[OptionLongWithDefault], "valueLong", classOf[Long])
5757
try {
58-
val v1 = deserialize("""{"valueLong":151}""", classOf[OptionLong])
59-
v1 shouldBe OptionLong(Some(151L))
58+
val v1 = deserialize("""{"valueLong":151}""", classOf[OptionLongWithDefault])
59+
v1 shouldBe OptionLongWithDefault(Some(151L))
6060
v1.valueLong.get shouldBe 151L
6161
//this next call will fail with a Scala unboxing exception unless you call ScalaAnnotationIntrospectorModule.registerReferencedValueType
6262
//or use one of the equivalent classes in OptionWithNumberDeserializerTest

0 commit comments

Comments
 (0)