Skip to content

Commit b02c1d8

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

File tree

1 file changed

+37
-7
lines changed

1 file changed

+37
-7
lines changed

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

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ package com.fasterxml.jackson.module.scala.introspect
22

33
import com.fasterxml.jackson.annotation.JsonCreator
44
import com.fasterxml.jackson.databind.`type`.ClassKey
5+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
56
import com.fasterxml.jackson.databind.cfg.MapperConfig
67
import com.fasterxml.jackson.databind.deser.std.StdValueInstantiator
78
import com.fasterxml.jackson.databind.deser._
89
import com.fasterxml.jackson.databind.introspect._
9-
import com.fasterxml.jackson.databind.util.{AccessPattern, LRUMap, LookupCache}
10-
import com.fasterxml.jackson.databind.{BeanDescription, DeserializationConfig, DeserializationContext, MapperFeature}
10+
import com.fasterxml.jackson.databind.util.{AccessPattern, Converter, LRUMap, LookupCache}
11+
import com.fasterxml.jackson.databind.{BeanDescription, DeserializationConfig, DeserializationContext, JsonDeserializer, KeyDeserializer, MapperFeature}
1112
import com.fasterxml.jackson.module.scala.JacksonModule
1213
import com.fasterxml.jackson.module.scala.util.Implicits._
1314

1415
import java.lang.annotation.Annotation
15-
import scala.collection.JavaConverters._
1616

1717
object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueInstantiators {
1818
private [this] var _descriptorCache: LookupCache[ClassKey, BeanDescriptor] =
@@ -140,20 +140,23 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI
140140
// Locate the constructor param that matches it
141141
descriptor.properties.find(_.param.exists(_.index == creator.getCreatorIndex)) match {
142142
case Some(pd) => {
143-
println(s">>>>> override ${pd.name} ${overrides.get(pd.name)}")
143+
val mappedCreator = overrides.get(pd.name) match {
144+
case Some(refClass) => WrappedCreatorProperty(creator, refClass)
145+
case _ => creator
146+
}
144147
if (applyDefaultValues) {
145148
pd match {
146149
case PropertyDescriptor(_, Some(ConstructorParameter(_, _, Some(defaultValue))), _, _, _, _, _) => {
147-
creator.withNullProvider(new NullValueProvider {
150+
mappedCreator.withNullProvider(new NullValueProvider {
148151
override def getNullValue(ctxt: DeserializationContext): AnyRef = defaultValue()
149152

150153
override def getNullAccessPattern: AccessPattern = AccessPattern.DYNAMIC
151154
})
152155
}
153-
case _ => creator
156+
case _ => mappedCreator
154157
}
155158
} else {
156-
creator
159+
mappedCreator
157160
}
158161
}
159162
case _ => creator
@@ -250,3 +253,30 @@ trait ScalaAnnotationIntrospectorModule extends JacksonModule {
250253
this += { _.appendAnnotationIntrospector(ScalaAnnotationIntrospector) }
251254
this += { _.addValueInstantiators(ScalaAnnotationIntrospector) }
252255
}
256+
257+
private case class WrappedCreatorProperty(creatorProperty: CreatorProperty, refClass: Class[_])
258+
extends CreatorProperty(creatorProperty, creatorProperty.getFullName) {
259+
260+
override def getAnnotation[A <: Annotation](acls: Class[A]): A = {
261+
val result = Option(super.getAnnotation(acls)) match {
262+
case None if acls.isAssignableFrom(classOf[JsonDeserialize]) => Some(getInstanceOfContentAsAnnotation())
263+
case result => result
264+
}
265+
result.orNull.asInstanceOf[A]
266+
}
267+
268+
private def getInstanceOfContentAsAnnotation(): JsonDeserialize = {
269+
new JsonDeserialize() {
270+
override def contentAs: Class[_] = refClass
271+
override def annotationType: Class[JsonDeserialize] = classOf[JsonDeserialize]
272+
override def as(): Class[_] = classOf[Void]
273+
override def keyAs(): Class[_] = classOf[Void]
274+
override def builder(): Class[_] = classOf[Void]
275+
override def contentConverter(): Class[_ <: Converter[_, _]] = classOf[Converter.None]
276+
override def converter(): Class[_ <: Converter[_, _]] = classOf[Converter.None]
277+
override def using(): Class[_ <: JsonDeserializer[_]] = classOf[JsonDeserializer.None]
278+
override def contentUsing(): Class[_ <: JsonDeserializer[_]] = classOf[JsonDeserializer.None]
279+
override def keyUsing(): Class[_ <: KeyDeserializer] = classOf[KeyDeserializer.None]
280+
}
281+
}
282+
}

0 commit comments

Comments
 (0)