@@ -2,17 +2,17 @@ package com.fasterxml.jackson.module.scala.introspect
2
2
3
3
import com .fasterxml .jackson .annotation .JsonCreator
4
4
import com .fasterxml .jackson .databind .`type` .ClassKey
5
+ import com .fasterxml .jackson .databind .annotation .JsonDeserialize
5
6
import com .fasterxml .jackson .databind .cfg .MapperConfig
6
7
import com .fasterxml .jackson .databind .deser .std .StdValueInstantiator
7
8
import com .fasterxml .jackson .databind .deser ._
8
9
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 }
11
12
import com .fasterxml .jackson .module .scala .JacksonModule
12
13
import com .fasterxml .jackson .module .scala .util .Implicits ._
13
14
14
15
import java .lang .annotation .Annotation
15
- import scala .collection .JavaConverters ._
16
16
17
17
object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueInstantiators {
18
18
private [this ] var _descriptorCache : LookupCache [ClassKey , BeanDescriptor ] =
@@ -140,20 +140,23 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI
140
140
// Locate the constructor param that matches it
141
141
descriptor.properties.find(_.param.exists(_.index == creator.getCreatorIndex)) match {
142
142
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
+ }
144
147
if (applyDefaultValues) {
145
148
pd match {
146
149
case PropertyDescriptor (_, Some (ConstructorParameter (_, _, Some (defaultValue))), _, _, _, _, _) => {
147
- creator .withNullProvider(new NullValueProvider {
150
+ mappedCreator .withNullProvider(new NullValueProvider {
148
151
override def getNullValue (ctxt : DeserializationContext ): AnyRef = defaultValue()
149
152
150
153
override def getNullAccessPattern : AccessPattern = AccessPattern .DYNAMIC
151
154
})
152
155
}
153
- case _ => creator
156
+ case _ => mappedCreator
154
157
}
155
158
} else {
156
- creator
159
+ mappedCreator
157
160
}
158
161
}
159
162
case _ => creator
@@ -250,3 +253,30 @@ trait ScalaAnnotationIntrospectorModule extends JacksonModule {
250
253
this += { _.appendAnnotationIntrospector(ScalaAnnotationIntrospector ) }
251
254
this += { _.addValueInstantiators(ScalaAnnotationIntrospector ) }
252
255
}
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