Skip to content

Commit 6c04392

Browse files
committed
Update ScalaAnnotationIntrospectorModule.scala
1 parent e8d2846 commit 6c04392

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

src/main/scala/com/fasterxml/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
package com.fasterxml.jackson.module.scala.introspect
22

3-
import java.lang.annotation.Annotation
43
import com.fasterxml.jackson.annotation.JsonCreator
54
import com.fasterxml.jackson.databind.`type`.ClassKey
65
import com.fasterxml.jackson.databind.cfg.MapperConfig
76
import com.fasterxml.jackson.databind.deser.std.StdValueInstantiator
87
import com.fasterxml.jackson.databind.deser._
98
import com.fasterxml.jackson.databind.introspect._
109
import com.fasterxml.jackson.databind.util.{AccessPattern, LRUMap, LookupCache}
11-
import com.fasterxml.jackson.databind.{BeanDescription, DeserializationConfig, DeserializationContext, DeserializationFeature, MapperFeature}
10+
import com.fasterxml.jackson.databind.{BeanDescription, DeserializationConfig, DeserializationContext, MapperFeature}
1211
import com.fasterxml.jackson.module.scala.JacksonModule
1312
import com.fasterxml.jackson.module.scala.util.Implicits._
1413

14+
import java.lang.annotation.Annotation
15+
import scala.collection.JavaConverters._
16+
1517
object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueInstantiators {
1618
private [this] var _descriptorCache: LookupCache[ClassKey, BeanDescriptor] =
1719
new LRUMap[ClassKey, BeanDescriptor](16, 100)
1820

19-
private case class FieldKey(clazz: Class[_], fieldName: String)
21+
private case class ClassOverrides(overrides: scala.collection.mutable.Map[String, Class[_]] = scala.collection.mutable.Map.empty)
2022

21-
private val overrideMap = scala.collection.mutable.Map[FieldKey, Class[_]]()
23+
private val overrideMap = scala.collection.mutable.Map[Class[_], ClassOverrides]()
2224

2325
/**
2426
* jackson-module-scala does not always properly handle deserialization of Options or Collections wrapping
@@ -31,7 +33,7 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI
3133
* @param referencedType
3234
*/
3335
def registerReferencedType(clazz: Class[_], fieldName: String, referencedType: Class[_]): Unit = {
34-
overrideMap.update(FieldKey(clazz, fieldName), referencedType)
36+
overrideMap.getOrElseUpdate(clazz, ClassOverrides()).overrides.update(fieldName, referencedType)
3537
}
3638

3739
def clearRegisteredReferencedTypes(): Unit = {
@@ -128,15 +130,17 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI
128130
extends StdValueInstantiator(delegate) {
129131

130132
private val overriddenConstructorArguments: Array[SettableBeanProperty] = {
133+
val overrides = overrideMap.get(descriptor.beanType).map(_.overrides.toMap).getOrElse(Map.empty)
131134
val applyDefaultValues = config.isEnabled(MapperFeature.APPLY_DEFAULT_VALUES)
132135
val args = delegate.getFromObjectArguments(config)
133136
Option(args) match {
134-
case Some(array) if (applyDefaultValues || overrideMap.nonEmpty) => {
137+
case Some(array) if (applyDefaultValues || overrides.nonEmpty) => {
135138
array.map {
136139
case creator: CreatorProperty => {
137140
// Locate the constructor param that matches it
138141
descriptor.properties.find(_.param.exists(_.index == creator.getCreatorIndex)) match {
139142
case Some(pd) => {
143+
println(s">>>>> override ${pd.name} ${overrides.get(pd.name)}")
140144
if (applyDefaultValues) {
141145
pd match {
142146
case PropertyDescriptor(_, Some(ConstructorParameter(_, _, Some(defaultValue))), _, _, _, _, _) => {
@@ -173,7 +177,7 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI
173177
if (isMaybeScalaBeanType(beanDesc.getBeanClass)) {
174178

175179
_descriptorFor(beanDesc.getBeanClass).map { descriptor =>
176-
if (descriptor.properties.exists(_.param.exists(_.defaultValue.isDefined))) {
180+
if (overrideMap.contains(beanDesc.getBeanClass) || descriptor.properties.exists(_.param.exists(_.defaultValue.isDefined))) {
177181
defaultInstantiator match {
178182
case std: StdValueInstantiator =>
179183
new ScalaValueInstantiator(std, config, descriptor)

0 commit comments

Comments
 (0)