@@ -2,13 +2,12 @@ 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 , ReferenceType , SimpleType }
5
- import com .fasterxml .jackson .databind .annotation .JsonDeserialize
6
5
import com .fasterxml .jackson .databind .cfg .MapperConfig
7
6
import com .fasterxml .jackson .databind .deser .std .StdValueInstantiator
8
7
import com .fasterxml .jackson .databind .deser ._
9
8
import com .fasterxml .jackson .databind .introspect ._
10
- import com .fasterxml .jackson .databind .util .{AccessPattern , Converter , LRUMap , LookupCache }
11
- import com .fasterxml .jackson .databind .{BeanDescription , DeserializationConfig , DeserializationContext , JavaType , JsonDeserializer , KeyDeserializer , MapperFeature }
9
+ import com .fasterxml .jackson .databind .util .{AccessPattern , LRUMap , LookupCache }
10
+ import com .fasterxml .jackson .databind .{BeanDescription , DeserializationConfig , DeserializationContext , JavaType , MapperFeature }
12
11
import com .fasterxml .jackson .module .scala .JacksonModule
13
12
import com .fasterxml .jackson .module .scala .util .Implicits ._
14
13
@@ -25,17 +24,41 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI
25
24
/**
26
25
* jackson-module-scala does not always properly handle deserialization of Options or Collections wrapping
27
26
* Scala primitives (eg Int, Long, Boolean). There are general issues with serializing and deserializing
28
- * Scala 2 Enumerations. These issues can be worked around by adding Jackson annotations on the affected fields.
27
+ * Scala 2 Enumerations. This function will not help with Enumerations.
28
+ * <p>
29
+ * This function is experimental and may be removed or significantly reworked in a later release.
30
+ * <p>
31
+ * These issues can be worked around by adding Jackson annotations on the affected fields.
29
32
* This function is designed to be used when it is not possible to apply Jackson annotations.
30
33
*
31
- * @param clazz
32
- * @param fieldName
33
- * @param referencedType
34
+ * @param clazz the (case) class
35
+ * @param fieldName the field name in the (case) class
36
+ * @param referencedType the referenced type of the field - for `Option[Long]` - the referenced type is `Long`
37
+ * @see [[clearRegisteredReferencedTypes() ]]
38
+ * @see [[clearRegisteredReferencedTypes(Class[_])]]
39
+ * @since 2.13.0
34
40
*/
35
41
def registerReferencedType (clazz : Class [_], fieldName : String , referencedType : Class [_]): Unit = {
36
42
overrideMap.getOrElseUpdate(clazz, ClassOverrides ()).overrides.update(fieldName, referencedType)
37
43
}
38
44
45
+ /**
46
+ * clears the state associated with reference types for the given class
47
+ * @param clazz the class for which to remove the registered reference types
48
+ * @see [[registerReferencedType ]]
49
+ * @see [[clearRegisteredReferencedTypes() ]]
50
+ * @since 2.13.0
51
+ */
52
+ def clearRegisteredReferencedTypes (clazz : Class [_]): Unit = {
53
+ overrideMap.remove(clazz)
54
+ }
55
+
56
+ /**
57
+ * clears all the state associated with reference types
58
+ * @see [[registerReferencedType ]]
59
+ * @see [[clearRegisteredReferencedTypes(Class[_])]]
60
+ * @since 2.13.0
61
+ */
39
62
def clearRegisteredReferencedTypes (): Unit = {
40
63
overrideMap.clear()
41
64
}
@@ -257,41 +280,10 @@ trait ScalaAnnotationIntrospectorModule extends JacksonModule {
257
280
private case class WrappedCreatorProperty (creatorProperty : CreatorProperty , refClass : Class [_])
258
281
extends CreatorProperty (creatorProperty, creatorProperty.getFullName) {
259
282
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
- override def getContextAnnotation [A <: Annotation ](acls : Class [A ]): A = {
269
- val result = Option (super .getContextAnnotation(acls)) match {
270
- case None if acls.isAssignableFrom(classOf [JsonDeserialize ]) => Some (getInstanceOfContentAsAnnotation())
271
- case result => result
272
- }
273
- result.orNull.asInstanceOf [A ]
274
- }
275
-
276
283
override def getType : JavaType = {
277
284
super .getType match {
278
285
case rt : ReferenceType => ReferenceType .upgradeFrom(rt, SimpleType .constructUnsafe(refClass))
279
286
case other => other
280
287
}
281
288
}
282
-
283
- private def getInstanceOfContentAsAnnotation () = {
284
- new JsonDeserialize () {
285
- override def contentAs : Class [_] = refClass
286
- override def annotationType : Class [JsonDeserialize ] = classOf [JsonDeserialize ]
287
- override def as (): Class [_] = classOf [Void ]
288
- override def keyAs (): Class [_] = classOf [Void ]
289
- override def builder (): Class [_] = classOf [Void ]
290
- override def contentConverter (): Class [_ <: Converter [_, _]] = classOf [Converter .None ]
291
- override def converter (): Class [_ <: Converter [_, _]] = classOf [Converter .None ]
292
- override def using (): Class [_ <: JsonDeserializer [_]] = classOf [JsonDeserializer .None ]
293
- override def contentUsing (): Class [_ <: JsonDeserializer [_]] = classOf [JsonDeserializer .None ]
294
- override def keyUsing (): Class [_ <: KeyDeserializer ] = classOf [KeyDeserializer .None ]
295
- }
296
- }
297
289
}
0 commit comments