Skip to content

Commit ebaf6c5

Browse files
committed
Update ScalaAnnotationIntrospectorModule.scala
1 parent a357f15 commit ebaf6c5

File tree

1 file changed

+30
-38
lines changed

1 file changed

+30
-38
lines changed

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

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ package com.fasterxml.jackson.module.scala.introspect
22

33
import com.fasterxml.jackson.annotation.JsonCreator
44
import com.fasterxml.jackson.databind.`type`.{ClassKey, ReferenceType, SimpleType}
5-
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
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._
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}
1211
import com.fasterxml.jackson.module.scala.JacksonModule
1312
import com.fasterxml.jackson.module.scala.util.Implicits._
1413

@@ -25,17 +24,41 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI
2524
/**
2625
* jackson-module-scala does not always properly handle deserialization of Options or Collections wrapping
2726
* 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.
2932
* This function is designed to be used when it is not possible to apply Jackson annotations.
3033
*
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
3440
*/
3541
def registerReferencedType(clazz: Class[_], fieldName: String, referencedType: Class[_]): Unit = {
3642
overrideMap.getOrElseUpdate(clazz, ClassOverrides()).overrides.update(fieldName, referencedType)
3743
}
3844

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+
*/
3962
def clearRegisteredReferencedTypes(): Unit = {
4063
overrideMap.clear()
4164
}
@@ -257,41 +280,10 @@ trait ScalaAnnotationIntrospectorModule extends JacksonModule {
257280
private case class WrappedCreatorProperty(creatorProperty: CreatorProperty, refClass: Class[_])
258281
extends CreatorProperty(creatorProperty, creatorProperty.getFullName) {
259282

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-
276283
override def getType: JavaType = {
277284
super.getType match {
278285
case rt: ReferenceType => ReferenceType.upgradeFrom(rt, SimpleType.constructUnsafe(refClass))
279286
case other => other
280287
}
281288
}
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-
}
297289
}

0 commit comments

Comments
 (0)