Enable Jackson for 2.13 (#27136)
* Enable jackson for 2.13 * Fix 2.13 warnings in jackson module
This commit is contained in:
parent
893bd8b74b
commit
6e93bef605
5 changed files with 29 additions and 30 deletions
|
|
@ -157,10 +157,10 @@ class JacksonSerializationBench {
|
||||||
|
|
||||||
private def serializeDeserialize[T <: AnyRef](msg: T): T = {
|
private def serializeDeserialize[T <: AnyRef](msg: T): T = {
|
||||||
serialization.findSerializerFor(msg) match {
|
serialization.findSerializerFor(msg) match {
|
||||||
case serializer: SerializerWithStringManifest ⇒
|
case serializer: SerializerWithStringManifest =>
|
||||||
val blob = serializer.toBinary(msg)
|
val blob = serializer.toBinary(msg)
|
||||||
serializer.fromBinary(blob, serializer.manifest(msg)).asInstanceOf[T]
|
serializer.fromBinary(blob, serializer.manifest(msg)).asInstanceOf[T]
|
||||||
case serializer ⇒
|
case serializer =>
|
||||||
val blob = serializer.toBinary(msg)
|
val blob = serializer.toBinary(msg)
|
||||||
if (serializer.includeManifest)
|
if (serializer.includeManifest)
|
||||||
serializer.fromBinary(blob, Some(msg.getClass)).asInstanceOf[T]
|
serializer.fromBinary(blob, Some(msg.getClass)).asInstanceOf[T]
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,8 @@ object JacksonObjectMapperProvider extends ExtensionId[JacksonObjectMapperProvid
|
||||||
config: Config,
|
config: Config,
|
||||||
dynamicAccess: DynamicAccess,
|
dynamicAccess: DynamicAccess,
|
||||||
log: Option[LoggingAdapter]) = {
|
log: Option[LoggingAdapter]) = {
|
||||||
import scala.collection.JavaConverters._
|
|
||||||
|
import akka.util.ccompat.JavaConverters._
|
||||||
|
|
||||||
val mapper = objectMapperFactory.newObjectMapper(bindingName, jsonFactory)
|
val mapper = objectMapperFactory.newObjectMapper(bindingName, jsonFactory)
|
||||||
|
|
||||||
|
|
@ -96,11 +97,11 @@ object JacksonObjectMapperProvider extends ExtensionId[JacksonObjectMapperProvid
|
||||||
if (configuredModules.contains("*"))
|
if (configuredModules.contains("*"))
|
||||||
ObjectMapper.findModules(dynamicAccess.classLoader).asScala
|
ObjectMapper.findModules(dynamicAccess.classLoader).asScala
|
||||||
else
|
else
|
||||||
configuredModules.flatMap { fqcn ⇒
|
configuredModules.flatMap { fqcn =>
|
||||||
if (isModuleEnabled(fqcn, dynamicAccess)) {
|
if (isModuleEnabled(fqcn, dynamicAccess)) {
|
||||||
dynamicAccess.createInstanceFor[Module](fqcn, Nil) match {
|
dynamicAccess.createInstanceFor[Module](fqcn, Nil) match {
|
||||||
case Success(m) ⇒ Some(m)
|
case Success(m) => Some(m)
|
||||||
case Failure(e) ⇒
|
case Failure(e) =>
|
||||||
log.foreach(
|
log.foreach(
|
||||||
_.error(
|
_.error(
|
||||||
e,
|
e,
|
||||||
|
|
@ -113,7 +114,7 @@ object JacksonObjectMapperProvider extends ExtensionId[JacksonObjectMapperProvid
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
val modules2 = modules1.map { module ⇒
|
val modules2 = modules1.map { module =>
|
||||||
if (module.isInstanceOf[ParameterNamesModule])
|
if (module.isInstanceOf[ParameterNamesModule])
|
||||||
// ParameterNamesModule needs a special case for the constructor to ensure that single-parameter
|
// ParameterNamesModule needs a special case for the constructor to ensure that single-parameter
|
||||||
// constructors are handled the same way as constructors with multiple parameters.
|
// constructors are handled the same way as constructors with multiple parameters.
|
||||||
|
|
@ -146,7 +147,7 @@ object JacksonObjectMapperProvider extends ExtensionId[JacksonObjectMapperProvid
|
||||||
}
|
}
|
||||||
|
|
||||||
private def features(config: Config, section: String): immutable.Seq[(String, Boolean)] = {
|
private def features(config: Config, section: String): immutable.Seq[(String, Boolean)] = {
|
||||||
import scala.collection.JavaConverters._
|
import akka.util.ccompat.JavaConverters._
|
||||||
val cfg = config.getConfig(section)
|
val cfg = config.getConfig(section)
|
||||||
cfg.root.keySet().asScala.map(key => key -> cfg.getBoolean(key)).toList
|
cfg.root.keySet().asScala.map(key => key -> cfg.getBoolean(key)).toList
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -150,16 +150,16 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private val migrations: Map[String, JacksonMigration] = {
|
private val migrations: Map[String, JacksonMigration] = {
|
||||||
import scala.collection.JavaConverters._
|
import akka.util.ccompat.JavaConverters._
|
||||||
conf.getConfig("migrations").root.unwrapped.asScala.toMap.map {
|
conf.getConfig("migrations").root.unwrapped.asScala.toMap.map {
|
||||||
case (k, v) ⇒
|
case (k, v) =>
|
||||||
val transformer = system.dynamicAccess.createInstanceFor[JacksonMigration](v.toString, Nil).get
|
val transformer = system.dynamicAccess.createInstanceFor[JacksonMigration](v.toString, Nil).get
|
||||||
k -> transformer
|
k -> transformer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private val blacklist: GadgetClassBlacklist = new GadgetClassBlacklist
|
private val blacklist: GadgetClassBlacklist = new GadgetClassBlacklist
|
||||||
private val whitelistClassPrefix = {
|
private val whitelistClassPrefix = {
|
||||||
import scala.collection.JavaConverters._
|
import akka.util.ccompat.JavaConverters._
|
||||||
conf.getStringList("whitelist-class-prefix").asScala.toVector
|
conf.getStringList("whitelist-class-prefix").asScala.toVector
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -177,8 +177,8 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
|
||||||
checkAllowedClassName(className)
|
checkAllowedClassName(className)
|
||||||
checkAllowedClass(obj.getClass)
|
checkAllowedClass(obj.getClass)
|
||||||
migrations.get(className) match {
|
migrations.get(className) match {
|
||||||
case Some(transformer) ⇒ className + "#" + transformer.currentVersion
|
case Some(transformer) => className + "#" + transformer.currentVersion
|
||||||
case None ⇒ className
|
case None => className
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -221,20 +221,20 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
|
||||||
val migration = migrations.get(manifestClassName)
|
val migration = migrations.get(manifestClassName)
|
||||||
|
|
||||||
val className = migration match {
|
val className = migration match {
|
||||||
case Some(transformer) if fromVersion < transformer.currentVersion ⇒
|
case Some(transformer) if fromVersion < transformer.currentVersion =>
|
||||||
transformer.transformClassName(fromVersion, manifestClassName)
|
transformer.transformClassName(fromVersion, manifestClassName)
|
||||||
case Some(transformer) if fromVersion > transformer.currentVersion ⇒
|
case Some(transformer) if fromVersion > transformer.currentVersion =>
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
s"Migration version ${transformer.currentVersion} is " +
|
s"Migration version ${transformer.currentVersion} is " +
|
||||||
s"behind version $fromVersion of deserialized type [$manifestClassName]")
|
s"behind version $fromVersion of deserialized type [$manifestClassName]")
|
||||||
case _ ⇒ manifestClassName
|
case _ => manifestClassName
|
||||||
}
|
}
|
||||||
if (className ne manifestClassName)
|
if (className ne manifestClassName)
|
||||||
checkAllowedClassName(className)
|
checkAllowedClassName(className)
|
||||||
|
|
||||||
val clazz = system.dynamicAccess.getClassFor[AnyRef](className) match {
|
val clazz = system.dynamicAccess.getClassFor[AnyRef](className) match {
|
||||||
case Success(c) ⇒ c
|
case Success(c) => c
|
||||||
case Failure(_) ⇒
|
case Failure(_) =>
|
||||||
throw new NotSerializableException(
|
throw new NotSerializableException(
|
||||||
s"Cannot find manifest class [$className] for serializer [${getClass.getName}].")
|
s"Cannot find manifest class [$className] for serializer [${getClass.getName}].")
|
||||||
}
|
}
|
||||||
|
|
@ -243,11 +243,11 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
|
||||||
val decompressBytes = if (compressed) decompress(bytes) else bytes
|
val decompressBytes = if (compressed) decompress(bytes) else bytes
|
||||||
|
|
||||||
val result = migration match {
|
val result = migration match {
|
||||||
case Some(transformer) if fromVersion < transformer.currentVersion ⇒
|
case Some(transformer) if fromVersion < transformer.currentVersion =>
|
||||||
val jsonTree = objectMapper.readTree(decompressBytes)
|
val jsonTree = objectMapper.readTree(decompressBytes)
|
||||||
val newJsonTree = transformer.transform(fromVersion, jsonTree)
|
val newJsonTree = transformer.transform(fromVersion, jsonTree)
|
||||||
objectMapper.treeToValue(newJsonTree, clazz)
|
objectMapper.treeToValue(newJsonTree, clazz)
|
||||||
case _ ⇒
|
case _ =>
|
||||||
objectMapper.readValue(decompressBytes, clazz)
|
objectMapper.readValue(decompressBytes, clazz)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -386,8 +386,8 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
|
||||||
val buffer = new Array[Byte](BufferSize)
|
val buffer = new Array[Byte](BufferSize)
|
||||||
|
|
||||||
@tailrec def readChunk(): Unit = in.read(buffer) match {
|
@tailrec def readChunk(): Unit = in.read(buffer) match {
|
||||||
case -1 ⇒ ()
|
case -1 => ()
|
||||||
case n ⇒
|
case n =>
|
||||||
out.write(buffer, 0, n)
|
out.write(buffer, 0, n)
|
||||||
readChunk()
|
readChunk()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -369,8 +369,8 @@ abstract class JacksonSerializerSpec(serializerName: String)
|
||||||
|
|
||||||
def serializerFor(obj: AnyRef, sys: ActorSystem = system): JacksonSerializer =
|
def serializerFor(obj: AnyRef, sys: ActorSystem = system): JacksonSerializer =
|
||||||
serialization(sys).findSerializerFor(obj) match {
|
serialization(sys).findSerializerFor(obj) match {
|
||||||
case serializer: JacksonSerializer ⇒ serializer
|
case serializer: JacksonSerializer => serializer
|
||||||
case s ⇒
|
case s =>
|
||||||
throw new IllegalStateException(s"Wrong serializer ${s.getClass} for ${obj.getClass}")
|
throw new IllegalStateException(s"Wrong serializer ${s.getClass} for ${obj.getClass}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
10
build.sbt
10
build.sbt
|
|
@ -42,6 +42,8 @@ lazy val aggregatedProjects: Seq[ProjectReference] = List[ProjectReference](
|
||||||
actorTestkitTyped,
|
actorTestkitTyped,
|
||||||
actorTyped,
|
actorTyped,
|
||||||
actorTypedTests,
|
actorTypedTests,
|
||||||
|
benchJmh,
|
||||||
|
benchJmhTyped,
|
||||||
cluster,
|
cluster,
|
||||||
clusterMetrics,
|
clusterMetrics,
|
||||||
clusterSharding,
|
clusterSharding,
|
||||||
|
|
@ -52,6 +54,7 @@ lazy val aggregatedProjects: Seq[ProjectReference] = List[ProjectReference](
|
||||||
discovery,
|
discovery,
|
||||||
distributedData,
|
distributedData,
|
||||||
docs,
|
docs,
|
||||||
|
jackson,
|
||||||
multiNodeTestkit,
|
multiNodeTestkit,
|
||||||
osgi,
|
osgi,
|
||||||
persistence,
|
persistence,
|
||||||
|
|
@ -68,10 +71,7 @@ lazy val aggregatedProjects: Seq[ProjectReference] = List[ProjectReference](
|
||||||
streamTests,
|
streamTests,
|
||||||
streamTestsTck,
|
streamTestsTck,
|
||||||
streamTyped,
|
streamTyped,
|
||||||
testkit) ++
|
testkit)
|
||||||
(if (isScala213) List.empty[ProjectReference]
|
|
||||||
else
|
|
||||||
List[ProjectReference](jackson, benchJmh, benchJmhTyped)) // FIXME #27019 remove 2.13 condition when Jackson ScalaModule has been released for Scala 2.13
|
|
||||||
|
|
||||||
lazy val root = Project(id = "akka", base = file("."))
|
lazy val root = Project(id = "akka", base = file("."))
|
||||||
.aggregate(aggregatedProjects: _*)
|
.aggregate(aggregatedProjects: _*)
|
||||||
|
|
@ -247,8 +247,6 @@ lazy val jackson = akkaModule("akka-serialization-jackson")
|
||||||
.settings(AutomaticModuleName.settings("akka.serialization.jackson"))
|
.settings(AutomaticModuleName.settings("akka.serialization.jackson"))
|
||||||
.settings(OSGi.jackson)
|
.settings(OSGi.jackson)
|
||||||
.settings(javacOptions += "-parameters")
|
.settings(javacOptions += "-parameters")
|
||||||
// FIXME #27019 remove when Jackson ScalaModule has been released for Scala 2.13
|
|
||||||
.settings(crossScalaVersions -= Dependencies.scala213Version)
|
|
||||||
.enablePlugins(ScaladocNoVerificationOfDiagrams)
|
.enablePlugins(ScaladocNoVerificationOfDiagrams)
|
||||||
.disablePlugins(MimaPlugin)
|
.disablePlugins(MimaPlugin)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue