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 073a0ac9..06c5346f 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 @@ -39,7 +39,9 @@ object ScalaAnnotationIntrospector extends NopAnnotationIntrospector with ValueI // For Scala, we want to use the declared order of the fields in the class override def findSerializationSortAlphabetically(ann: Annotated): java.lang.Boolean = { ann match { - case ac: AnnotatedClass if isMaybeScalaBeanType(ac.getAnnotated) => + case ac: AnnotatedClass if + ScalaAnnotationIntrospectorModule.isCaseClassDefaultSerializationOrderBasedOnDeclaredParamOrder && + isMaybeScalaBeanType(ac.getAnnotated) => val annotation = _findAnnotation(ac, classOf[JsonPropertyOrder]) if (annotation != null) { // delegate to JacksonAnnotationIntrospector @@ -468,7 +470,27 @@ trait ScalaAnnotationIntrospectorModule extends JacksonModule { def shouldSupportScala3Classes(): Boolean = _shouldSupportScala3Classes } -object ScalaAnnotationIntrospectorModule extends ScalaAnnotationIntrospectorModule +object ScalaAnnotationIntrospectorModule extends ScalaAnnotationIntrospectorModule { + private var caseClassDefaultOrderBasedOnDeclaredParamOrder = true + + /** + * @return Whether to default the serialization order of Case Class params to the defined order in the class. + * This should be set to false if you want to enable MapperFeature.SORT_PROPERTIES_ALPHABETICALLY. + * This is not needed in Jackson 3. + * @since 2.20.1 + */ + def isCaseClassDefaultSerializationOrderBasedOnDeclaredParamOrder: Boolean = + caseClassDefaultOrderBasedOnDeclaredParamOrder + + /** + * @param flag Whether to default the serialization order of Case Class params to the defined order in the class. + * This should be set to false if you want to enable MapperFeature.SORT_PROPERTIES_ALPHABETICALLY. + * This is not needed in Jackson 3. + * @since 2.20.1 + */ + def setCaseClassDefaultSerializationOrderBasedOnDeclaredParamOrder(flag: Boolean): Unit = + this.caseClassDefaultOrderBasedOnDeclaredParamOrder = flag +} private case class WrappedCreatorProperty(creatorProperty: CreatorProperty, refHolder: ClassHolder) extends CreatorProperty(creatorProperty, creatorProperty.getFullName) { diff --git a/src/test/scala/com/fasterxml/jackson/module/scala/ser/CaseClassSerializerTest.scala b/src/test/scala/com/fasterxml/jackson/module/scala/ser/CaseClassSerializerTest.scala index 8c885847..90e37b66 100644 --- a/src/test/scala/com/fasterxml/jackson/module/scala/ser/CaseClassSerializerTest.scala +++ b/src/test/scala/com/fasterxml/jackson/module/scala/ser/CaseClassSerializerTest.scala @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty.Access import com.fasterxml.jackson.annotation._ import com.fasterxml.jackson.databind.{MapperFeature, ObjectMapper, PropertyNamingStrategies} import com.fasterxml.jackson.module.scala.DefaultScalaModule +import com.fasterxml.jackson.module.scala.introspect.ScalaAnnotationIntrospectorModule import scala.beans.BeanProperty @@ -230,12 +231,16 @@ class CaseClassSerializerTest extends SerializerTest { } // https://github.com/FasterXML/jackson-module-scala/issues/772 - it should "sort properties of the case class" ignore { + it should "sort properties of the case class" in { val mapper = newBuilder .enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY) - .disable(MapperFeature.SORT_CREATOR_PROPERTIES_FIRST) .build() - serialize(ClassWithUnorderedFields(), mapper) shouldEqual """{"f0":0,"f1":1,"f2":2,"f3":3}""" + ScalaAnnotationIntrospectorModule.setCaseClassDefaultSerializationOrderBasedOnDeclaredParamOrder(false) + try { + serialize(ClassWithUnorderedFields(), mapper) shouldEqual """{"f0":0,"f1":1,"f2":2,"f3":3}""" + } finally { + ScalaAnnotationIntrospectorModule.setCaseClassDefaultSerializationOrderBasedOnDeclaredParamOrder(true) + } } it should "respect JsonPropertyOrder" in {