From 2958349c43a93dabbd8b003eec7dadb26808936e Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 19 Jan 2021 21:39:05 +0000 Subject: [PATCH 1/2] wip --- .../introspect/ScalaAnnotationIntrospectorModule.scala | 4 +++- .../com/fasterxml/jackson/module/scala/util/Classes.scala | 7 ++++++- .../jackson/module/scala/ser/ObjectSerializerTest.scala | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/scala/com/fasterxml/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala b/src/main/scala/com/fasterxml/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala index a1bef756d..b7298593b 100644 --- a/src/main/scala/com/fasterxml/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala +++ b/src/main/scala/com/fasterxml/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala @@ -17,12 +17,14 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI private [this] val _descriptorCache = new LRUMap[ClassKey, BeanDescriptor](16, 100) private def _descriptorFor(clz: Class[_]): Option[BeanDescriptor] = { - if (clz.hasSignature || clz.extendsScalaClass) { + if (clz.extendsScalaClass || clz.hasSignature) { + println("_descriptorFor adding " + clz) val key = new ClassKey(clz) Option(_descriptorCache.get(key)) match { case Some(result) => Some(result) case _ => { val introspector = BeanIntrospector(clz) + println("_descriptorFor introspector.properties " + introspector.properties) _descriptorCache.put(key, introspector) Some(introspector) } diff --git a/src/main/scala/com/fasterxml/jackson/module/scala/util/Classes.scala b/src/main/scala/com/fasterxml/jackson/module/scala/util/Classes.scala index 976680da3..fc470ffc7 100644 --- a/src/main/scala/com/fasterxml/jackson/module/scala/util/Classes.scala +++ b/src/main/scala/com/fasterxml/jackson/module/scala/util/Classes.scala @@ -2,11 +2,12 @@ package com.fasterxml.jackson.module.scala.util import scala.language.implicitConversions import scala.reflect.{ScalaLongSignature, ScalaSignature} +import scala.util.Try trait ClassW extends PimpedType[Class[_]] { def extendsScalaClass: Boolean = { - ClassW.productClass.isAssignableFrom(value) + ClassW.productClass.isAssignableFrom(value) || isScalaObject } def hasSignature: Boolean = { @@ -19,6 +20,10 @@ trait ClassW extends PimpedType[Class[_]] { } hasSigHelper(value) } + + private def isScalaObject: Boolean = { + Try(value.getField("MODULE$")).isSuccess + } } object ClassW { diff --git a/src/test/scala/com/fasterxml/jackson/module/scala/ser/ObjectSerializerTest.scala b/src/test/scala/com/fasterxml/jackson/module/scala/ser/ObjectSerializerTest.scala index c4d5925df..9343d21df 100644 --- a/src/test/scala/com/fasterxml/jackson/module/scala/ser/ObjectSerializerTest.scala +++ b/src/test/scala/com/fasterxml/jackson/module/scala/ser/ObjectSerializerTest.scala @@ -16,7 +16,7 @@ class ObjectSerializerTest extends SerializerTest { import ObjectSerializerTest._ def module = DefaultScalaModule - "An ObjectMapper with the DefaultScalaModule" should "serialize an object as a bean" ignore { + "An ObjectMapper with the DefaultScalaModule" should "serialize an object as a bean" in { serialize(ObjectWithoutJsonProperty) should ( equal ("""{"name":"name1","value":"value1"}""") or equal ("""{"value":"value1","name":"name1"}""") From 5ab5ce3154a7193146b7a5d957c5f8c80b2ce9b9 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 19 Jan 2021 23:00:26 +0000 Subject: [PATCH 2/2] wip --- .../jackson/module/scala/introspect/BeanIntrospector.scala | 3 ++- .../scala/introspect/ScalaAnnotationIntrospectorModule.scala | 2 -- .../com/fasterxml/jackson/module/scala/util/Classes.scala | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/scala/com/fasterxml/jackson/module/scala/introspect/BeanIntrospector.scala b/src/main/scala/com/fasterxml/jackson/module/scala/introspect/BeanIntrospector.scala index 2eebd61cc..f22f79d06 100644 --- a/src/main/scala/com/fasterxml/jackson/module/scala/introspect/BeanIntrospector.scala +++ b/src/main/scala/com/fasterxml/jackson/module/scala/introspect/BeanIntrospector.scala @@ -187,10 +187,11 @@ object BeanIntrospector { //create properties for all appropriate fields val fields = for { cls <- hierarchy + classW = ClassW(cls) field <- cls.getDeclaredFields name = maybePrivateName(field) if !name.contains('$') - if (isScalaCaseObject(cls) || isAcceptableField(field)) + if (classW.isScalaObject || isScalaCaseObject(cls) || isAcceptableField(field)) beanGetter = findBeanGetter(cls, name) beanSetter = findBeanSetter(cls, name) } yield PropertyDescriptor(name, findConstructorParam(hierarchy.head, name), Some(field), findGetter(cls, name), findSetter(cls, name), beanGetter, beanSetter) diff --git a/src/main/scala/com/fasterxml/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala b/src/main/scala/com/fasterxml/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala index b7298593b..c9daecdf6 100644 --- a/src/main/scala/com/fasterxml/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala +++ b/src/main/scala/com/fasterxml/jackson/module/scala/introspect/ScalaAnnotationIntrospectorModule.scala @@ -18,13 +18,11 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI private def _descriptorFor(clz: Class[_]): Option[BeanDescriptor] = { if (clz.extendsScalaClass || clz.hasSignature) { - println("_descriptorFor adding " + clz) val key = new ClassKey(clz) Option(_descriptorCache.get(key)) match { case Some(result) => Some(result) case _ => { val introspector = BeanIntrospector(clz) - println("_descriptorFor introspector.properties " + introspector.properties) _descriptorCache.put(key, introspector) Some(introspector) } diff --git a/src/main/scala/com/fasterxml/jackson/module/scala/util/Classes.scala b/src/main/scala/com/fasterxml/jackson/module/scala/util/Classes.scala index fc470ffc7..bdbdc417c 100644 --- a/src/main/scala/com/fasterxml/jackson/module/scala/util/Classes.scala +++ b/src/main/scala/com/fasterxml/jackson/module/scala/util/Classes.scala @@ -21,7 +21,7 @@ trait ClassW extends PimpedType[Class[_]] { hasSigHelper(value) } - private def isScalaObject: Boolean = { + def isScalaObject: Boolean = { Try(value.getField("MODULE$")).isSuccess } }