Test jackson support for scala enumerations (#28726)
* Extends Spec over scala enumerations * Adds documentation for scala enumeration support serializing with Jackson
This commit is contained in:
parent
3d8b4360f0
commit
bcfdb896b0
2 changed files with 44 additions and 1 deletions
|
|
@ -173,6 +173,16 @@ This can be solved by implementing a custom serialization for the enums. Annotat
|
||||||
Scala
|
Scala
|
||||||
: @@snip [CustomAdtSerializer.scala](/akka-serialization-jackson/src/test/scala/doc/akka/serialization/jackson/CustomAdtSerializer.scala) { #adt-trait-object }
|
: @@snip [CustomAdtSerializer.scala](/akka-serialization-jackson/src/test/scala/doc/akka/serialization/jackson/CustomAdtSerializer.scala) { #adt-trait-object }
|
||||||
|
|
||||||
|
### Enumerations
|
||||||
|
|
||||||
|
Jackson support for Scala Enumerations defaults to serializing a `Value` as a `JsonObject` that includes a
|
||||||
|
field with the `"value"` and a field with the `"type"` whose value is the FQCN of the enumeration. Jackson
|
||||||
|
includes the [`@JsonScalaEnumeration`](https://github.com/FasterXML/jackson-module-scala/wiki/Enumerations) to
|
||||||
|
statically specify the type information to a field. When using the `@JsonScalaEnumeration` annotation the enumeration
|
||||||
|
value is serialized as a JsonString.
|
||||||
|
|
||||||
|
Scala
|
||||||
|
: @@snip [JacksonSerializerSpec.scala](/akka-serialization-jackson/src/test/scala/akka/serialization/jackson/JacksonSerializerSpec.scala) { #jackson-scala-enumeration }
|
||||||
|
|
||||||
@@@
|
@@@
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ import java.util.logging.FileHandler
|
||||||
import scala.collection.immutable
|
import scala.collection.immutable
|
||||||
import scala.concurrent.duration.FiniteDuration
|
import scala.concurrent.duration.FiniteDuration
|
||||||
import scala.concurrent.duration._
|
import scala.concurrent.duration._
|
||||||
|
|
||||||
import akka.actor.ActorRef
|
import akka.actor.ActorRef
|
||||||
import akka.actor.ActorSystem
|
import akka.actor.ActorSystem
|
||||||
import akka.actor.Address
|
import akka.actor.Address
|
||||||
|
|
@ -51,7 +50,9 @@ import com.fasterxml.jackson.core.JsonParser
|
||||||
import com.fasterxml.jackson.core.JsonGenerator
|
import com.fasterxml.jackson.core.JsonGenerator
|
||||||
import com.fasterxml.jackson.core.StreamReadFeature
|
import com.fasterxml.jackson.core.StreamReadFeature
|
||||||
import com.fasterxml.jackson.core.StreamWriteFeature
|
import com.fasterxml.jackson.core.StreamWriteFeature
|
||||||
|
import com.fasterxml.jackson.core.`type`.TypeReference
|
||||||
import com.fasterxml.jackson.databind.json.JsonMapper
|
import com.fasterxml.jackson.databind.json.JsonMapper
|
||||||
|
import com.fasterxml.jackson.module.scala.JsonScalaEnumeration
|
||||||
import com.github.ghik.silencer.silent
|
import com.github.ghik.silencer.silent
|
||||||
|
|
||||||
object ScalaTestMessages {
|
object ScalaTestMessages {
|
||||||
|
|
@ -96,6 +97,21 @@ object ScalaTestMessages {
|
||||||
|
|
||||||
final case class OldCommandNotInBindings(name: String)
|
final case class OldCommandNotInBindings(name: String)
|
||||||
|
|
||||||
|
// #jackson-scala-enumeration
|
||||||
|
object Planet extends Enumeration {
|
||||||
|
type Planet = Value
|
||||||
|
val Mercury, Venus, Earth, Mars, Krypton = Value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uses default Jackson serialization format for Scala Enumerations
|
||||||
|
final case class Alien(name: String, planet: Planet.Planet) extends TestMessage
|
||||||
|
|
||||||
|
// Serializes planet values as a JsonString
|
||||||
|
class PlanetType extends TypeReference[Planet.type] {}
|
||||||
|
final case class Superhero(name: String, @JsonScalaEnumeration(classOf[PlanetType]) planet: Planet.Planet)
|
||||||
|
extends TestMessage
|
||||||
|
// #jackson-scala-enumeration
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ScalaTestEventMigration extends JacksonMigration {
|
class ScalaTestEventMigration extends JacksonMigration {
|
||||||
|
|
@ -463,6 +479,15 @@ class JacksonJsonSerializerSpec extends JacksonSerializerSpec("jackson-json") {
|
||||||
deserializeFromJsonString(json, serializer.identifier, serializer.manifest(expected)) should ===(expected)
|
deserializeFromJsonString(json, serializer.identifier, serializer.manifest(expected)) should ===(expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"deserialize Enumerations as String when configured" in {
|
||||||
|
val json = """{"name":"Superman", "planet":"Krypton"}"""
|
||||||
|
|
||||||
|
val expected = Superhero("Superman", Planet.Krypton)
|
||||||
|
val serializer = serializerFor(expected)
|
||||||
|
|
||||||
|
deserializeFromJsonString(json, serializer.identifier, serializer.manifest(expected)) should ===(expected)
|
||||||
|
}
|
||||||
|
|
||||||
"compress large payload with gzip" in {
|
"compress large payload with gzip" in {
|
||||||
val conf = JacksonObjectMapperProvider.configForBinding("jackson-json", system.settings.config)
|
val conf = JacksonObjectMapperProvider.configForBinding("jackson-json", system.settings.config)
|
||||||
val compressionAlgo = conf.getString("compression.algorithm")
|
val compressionAlgo = conf.getString("compression.algorithm")
|
||||||
|
|
@ -722,6 +747,14 @@ abstract class JacksonSerializerSpec(serializerName: String)
|
||||||
checkSerialization(BooleanCommand(false))
|
checkSerialization(BooleanCommand(false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"serialize message with Enumeration property (using Jackson legacy format)" in {
|
||||||
|
checkSerialization(Alien("E.T.", Planet.Mars))
|
||||||
|
}
|
||||||
|
|
||||||
|
"serialize message with Enumeration property as a String" in {
|
||||||
|
checkSerialization(Superhero("Kal El", Planet.Krypton))
|
||||||
|
}
|
||||||
|
|
||||||
"serialize message with Optional property" in {
|
"serialize message with Optional property" in {
|
||||||
checkSerialization(OptionCommand(Some("abc")))
|
checkSerialization(OptionCommand(Some("abc")))
|
||||||
checkSerialization(OptionCommand(None))
|
checkSerialization(OptionCommand(None))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue