Suppress Java Serializer warnings when extending NoSerializationVerificationNeeded (#19963) (#20785)
This commit is contained in:
parent
625413e413
commit
08aa41c818
4 changed files with 82 additions and 5 deletions
|
|
@ -0,0 +1,14 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2009-2016 Lightbend Inc. <http://www.lightbend.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
package test.akka.serialization
|
||||||
|
|
||||||
|
import akka.actor.NoSerializationVerificationNeeded
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is currently used in NoSerializationVerificationNeeded test cases in SerializeSpec,
|
||||||
|
* as they needed a serializable class whose top package is not akka.
|
||||||
|
*/
|
||||||
|
class NoVerification extends NoSerializationVerificationNeeded with java.io.Serializable {
|
||||||
|
}
|
||||||
|
|
@ -17,6 +17,8 @@ import scala.beans.BeanInfo
|
||||||
import com.typesafe.config._
|
import com.typesafe.config._
|
||||||
import akka.pattern.ask
|
import akka.pattern.ask
|
||||||
import org.apache.commons.codec.binary.Hex.encodeHex
|
import org.apache.commons.codec.binary.Hex.encodeHex
|
||||||
|
import akka.actor.NoSerializationVerificationNeeded
|
||||||
|
import test.akka.serialization.NoVerification
|
||||||
|
|
||||||
object SerializationTests {
|
object SerializationTests {
|
||||||
|
|
||||||
|
|
@ -424,18 +426,18 @@ class DefaultSerializationWarningSpec extends AkkaSpec(
|
||||||
ConfigFactory.parseString("akka.actor.warn-about-java-serializer-usage = on")) {
|
ConfigFactory.parseString("akka.actor.warn-about-java-serializer-usage = on")) {
|
||||||
|
|
||||||
val ser = SerializationExtension(system)
|
val ser = SerializationExtension(system)
|
||||||
val messagePrefix = "Using the default Java serializer for class.*"
|
val messagePrefix = "Using the default Java serializer for class"
|
||||||
|
|
||||||
"Using the default Java serializer" must {
|
"Using the default Java serializer" must {
|
||||||
|
|
||||||
"log a warning when serializing classes outside of java.lang package" in {
|
"log a warning when serializing classes outside of java.lang package" in {
|
||||||
EventFilter.warning(message = messagePrefix) intercept {
|
EventFilter.warning(start = messagePrefix, occurrences = 1) intercept {
|
||||||
ser.serializerFor(classOf[java.math.BigDecimal])
|
ser.serializerFor(classOf[java.math.BigDecimal])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
"not log warning when serializing classes from java.lang package" in {
|
"not log warning when serializing classes from java.lang package" in {
|
||||||
EventFilter.warning(message = messagePrefix, occurrences = 0) intercept {
|
EventFilter.warning(start = messagePrefix, occurrences = 0) intercept {
|
||||||
ser.serializerFor(classOf[java.lang.String])
|
ser.serializerFor(classOf[java.lang.String])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -444,6 +446,54 @@ class DefaultSerializationWarningSpec extends AkkaSpec(
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NoVerificationWarningSpec extends AkkaSpec(
|
||||||
|
ConfigFactory.parseString(
|
||||||
|
"akka.actor.warn-about-java-serializer-usage = on\n" +
|
||||||
|
"akka.actor.warn-on-no-serialization-verification = on")) {
|
||||||
|
|
||||||
|
val ser = SerializationExtension(system)
|
||||||
|
val messagePrefix = "Using the default Java serializer for class"
|
||||||
|
|
||||||
|
"When warn-on-no-serialization-verification = on, using the default Java serializer" must {
|
||||||
|
|
||||||
|
"log a warning on classes without extending NoSerializationVerificationNeeded" in {
|
||||||
|
EventFilter.warning(start = messagePrefix, occurrences = 1) intercept {
|
||||||
|
ser.serializerFor(classOf[java.math.BigDecimal])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"still log warning on classes extending NoSerializationVerificationNeeded" in {
|
||||||
|
EventFilter.warning(start = messagePrefix, occurrences = 1) intercept {
|
||||||
|
ser.serializerFor(classOf[NoVerification])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NoVerificationWarningOffSpec extends AkkaSpec(
|
||||||
|
ConfigFactory.parseString(
|
||||||
|
"akka.actor.warn-about-java-serializer-usage = on\n" +
|
||||||
|
"akka.actor.warn-on-no-serialization-verification = off")) {
|
||||||
|
|
||||||
|
val ser = SerializationExtension(system)
|
||||||
|
val messagePrefix = "Using the default Java serializer for class"
|
||||||
|
|
||||||
|
"When warn-on-no-serialization-verification = off, using the default Java serializer" must {
|
||||||
|
|
||||||
|
"log a warning on classes without extending NoSerializationVerificationNeeded" in {
|
||||||
|
EventFilter.warning(start = messagePrefix, occurrences = 1) intercept {
|
||||||
|
ser.serializerFor(classOf[java.math.BigDecimal])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"not log warning on classes extending NoSerializationVerificationNeeded" in {
|
||||||
|
EventFilter.warning(start = messagePrefix, occurrences = 0) intercept {
|
||||||
|
ser.serializerFor(classOf[NoVerification])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected[akka] trait TestSerializable
|
protected[akka] trait TestSerializable
|
||||||
|
|
||||||
protected[akka] class TestSerializer extends Serializer {
|
protected[akka] class TestSerializer extends Serializer {
|
||||||
|
|
|
||||||
|
|
@ -590,6 +590,12 @@ akka {
|
||||||
# you can turn this off.
|
# you can turn this off.
|
||||||
warn-about-java-serializer-usage = on
|
warn-about-java-serializer-usage = on
|
||||||
|
|
||||||
|
# To be used with the above warn-about-java-serializer-usage
|
||||||
|
# When warn-about-java-serializer-usage = on, and this warn-on-no-serialization-verification = off,
|
||||||
|
# warnings are suppressed for classes extending NoSerializationVerificationNeeded
|
||||||
|
# to reduce noize.
|
||||||
|
warn-on-no-serialization-verification = on
|
||||||
|
|
||||||
# Configuration namespace of serialization identifiers.
|
# Configuration namespace of serialization identifiers.
|
||||||
# Each serializer implementation must have an entry in the following format:
|
# Each serializer implementation must have an entry in the following format:
|
||||||
# `akka.actor.serialization-identifiers."FQCN" = ID`
|
# `akka.actor.serialization-identifiers."FQCN" = ID`
|
||||||
|
|
|
||||||
|
|
@ -247,13 +247,20 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
|
||||||
Map(NullSerializer.identifier → NullSerializer) ++ serializers map { case (_, v) ⇒ (v.identifier, v) }
|
Map(NullSerializer.identifier → NullSerializer) ++ serializers map { case (_, v) ⇒ (v.identifier, v) }
|
||||||
|
|
||||||
private val isJavaSerializationWarningEnabled = settings.config.getBoolean("akka.actor.warn-about-java-serializer-usage")
|
private val isJavaSerializationWarningEnabled = settings.config.getBoolean("akka.actor.warn-about-java-serializer-usage")
|
||||||
|
private val isWarningOnNoVerificationEnabled = settings.config.getBoolean("akka.actor.warn-on-no-serialization-verification")
|
||||||
|
|
||||||
private def shouldWarnAboutJavaSerializer(serializedClass: Class[_], serializer: Serializer) = {
|
private def shouldWarnAboutJavaSerializer(serializedClass: Class[_], serializer: Serializer) = {
|
||||||
|
|
||||||
|
def suppressWarningOnNonSerializationVerification(serializedClass: Class[_]) = {
|
||||||
|
//suppressed, only when warn-on-no-serialization-verification = off, and extending NoSerializationVerificationNeeded
|
||||||
|
!isWarningOnNoVerificationEnabled && classOf[NoSerializationVerificationNeeded].isAssignableFrom(serializedClass)
|
||||||
|
}
|
||||||
|
|
||||||
isJavaSerializationWarningEnabled &&
|
isJavaSerializationWarningEnabled &&
|
||||||
serializer.isInstanceOf[JavaSerializer] &&
|
serializer.isInstanceOf[JavaSerializer] &&
|
||||||
!serializedClass.getName.startsWith("akka.") &&
|
!serializedClass.getName.startsWith("akka.") &&
|
||||||
!serializedClass.getName.startsWith("java.lang.")
|
!serializedClass.getName.startsWith("java.lang.") &&
|
||||||
}
|
!suppressWarningOnNonSerializationVerification(serializedClass)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue