Skip to content

Commit 8b641bb

Browse files
authored
support jackson 2.17 (#1072)
more changes Create PR1072.backwards.excludes Update JsonConfig.scala Update JacksonJson.scala Update build.sbt Update build.sbt support overriding max string length
1 parent 23e0d18 commit 8b641bb

File tree

4 files changed

+56
-11
lines changed

4 files changed

+56
-11
lines changed

build.sbt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ def specs2(scalaVersion: String) =
2121
("org.specs2" %% s"specs2-$n" % "4.21.0") % Test
2222
}
2323

24-
val jacksonDatabindVersion = "2.14.3"
24+
val jacksonDatabindVersion = "2.19.1"
2525
val jacksonDatabind = Seq(
2626
"com.fasterxml.jackson.core" % "jackson-databind" % jacksonDatabindVersion
2727
)
2828

29-
val jacksonVersion = "2.14.3"
29+
val jacksonVersion = jacksonDatabindVersion
3030
val jacksons = Seq(
3131
"com.fasterxml.jackson.core" % "jackson-core",
3232
"com.fasterxml.jackson.core" % "jackson-annotations",
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# private final class JsonConfigImpl has changed
2+
ProblemFilters.exclude[MissingTypesProblem]("play.api.libs.json.JsonConfigImpl$")

play-json/jvm/src/main/scala/play/api/libs/json/JsonConfig.scala

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
package play.api.libs.json
66

7+
import com.fasterxml.jackson.core.StreamReadConstraints
8+
79
import play.api.libs.json.JsonConfig.defaultMaxPlain
810
import play.api.libs.json.JsonConfig.defaultMinPlain
911
import play.api.libs.json.JsonConfig.defaultDigitsLimit
@@ -103,6 +105,7 @@ private final case class DecimalSerializerSettingsImpl(
103105
sealed trait JsonConfig {
104106
def bigDecimalParseConfig: BigDecimalParseConfig
105107
def bigDecimalSerializerConfig: BigDecimalSerializerConfig
108+
def streamReadConstraints: StreamReadConstraints
106109
}
107110

108111
object JsonConfig {
@@ -168,6 +171,17 @@ object JsonConfig {
168171
*/
169172
val maxPlainProperty: String = "play.json.serializer.maxPlain"
170173

174+
/**
175+
* The system property to override the max nesting depth for JSON parsing.
176+
*/
177+
val maxNestingDepth: String = "play.json.parser.maxNestingDepth"
178+
179+
/**
180+
* The system property to override the max string length for JSON parsing.
181+
* This is used to limit the length of individual strings in JSON documents.
182+
*/
183+
val maxStringLength: String = "play.json.parser.maxStringLength"
184+
171185
/**
172186
* The system property to override whether zero decimals (e.g. .0 or .00) are written by default. These are dropped by default.
173187
*/
@@ -183,15 +197,30 @@ object JsonConfig {
183197

184198
private[json] def loadMaxPlain: BigDecimal = prop(maxPlainProperty, defaultMaxPlain)(BigDecimal.exact)
185199

200+
private[json] def loadMaxNestingDepth: Int =
201+
prop(maxNestingDepth, StreamReadConstraints.DEFAULT_MAX_DEPTH)(Integer.parseInt)
202+
203+
private[json] def loadMaxStringLength: Int =
204+
prop(maxStringLength, StreamReadConstraints.DEFAULT_MAX_STRING_LEN)(Integer.parseInt)
205+
186206
private[json] def loadPreserveZeroDecimal: Boolean =
187207
prop(preserveZeroDecimalProperty, defaultPreserveZeroDecimal)(_.toBoolean)
188208

209+
private[json] val defaultStreamReadConstraints: StreamReadConstraints =
210+
StreamReadConstraints
211+
.builder()
212+
.maxNestingDepth(loadMaxNestingDepth)
213+
.maxStringLength(loadMaxStringLength)
214+
.maxNumberLength(Int.MaxValue) // play-json has its own support for limiting number length
215+
.build()
216+
189217
// Default settings, which can be controlled with system properties.
190218
// To override, call JacksonJson.setConfig()
191219
val settings: JsonConfig =
192220
JsonConfig(
193221
BigDecimalParseConfig(loadMathContext, loadScaleLimit, loadDigitsLimit),
194-
BigDecimalSerializerConfig(loadMinPlain, loadMaxPlain, loadPreserveZeroDecimal)
222+
BigDecimalSerializerConfig(loadMinPlain, loadMaxPlain, loadPreserveZeroDecimal),
223+
defaultStreamReadConstraints
195224
)
196225

197226
def apply(): JsonConfig = apply(BigDecimalParseConfig(), BigDecimalSerializerConfig())
@@ -200,7 +229,14 @@ object JsonConfig {
200229
bigDecimalParseConfig: BigDecimalParseConfig,
201230
bigDecimalSerializerConfig: BigDecimalSerializerConfig
202231
): JsonConfig =
203-
JsonConfigImpl(bigDecimalParseConfig, bigDecimalSerializerConfig)
232+
JsonConfigImpl(bigDecimalParseConfig, bigDecimalSerializerConfig, defaultStreamReadConstraints)
233+
234+
def apply(
235+
bigDecimalParseConfig: BigDecimalParseConfig,
236+
bigDecimalSerializerConfig: BigDecimalSerializerConfig,
237+
streamReadConstraints: StreamReadConstraints
238+
): JsonConfig =
239+
JsonConfigImpl(bigDecimalParseConfig, bigDecimalSerializerConfig, streamReadConstraints)
204240

205241
private[json] def parseMathContext(key: String): MathContext = sys.props.get(key).map(_.toLowerCase) match {
206242
case Some("decimal128") => MathContext.DECIMAL128
@@ -220,7 +256,8 @@ object JsonConfig {
220256

221257
private final case class JsonConfigImpl(
222258
bigDecimalParseConfig: BigDecimalParseConfig,
223-
bigDecimalSerializerConfig: BigDecimalSerializerConfig
259+
bigDecimalSerializerConfig: BigDecimalSerializerConfig,
260+
streamReadConstraints: StreamReadConstraints
224261
) extends JsonConfig
225262

226263
@deprecated("Use BigDecimalParseConfig instead", "2.9.4")
@@ -241,7 +278,8 @@ final case class BigDecimalSerializerSettings(
241278
@deprecated("Use JsonConfig instead", "2.9.4")
242279
final case class JsonParserSettings(
243280
bigDecimalParseSettings: BigDecimalParseSettings,
244-
bigDecimalSerializerSettings: BigDecimalSerializerSettings
281+
bigDecimalSerializerSettings: BigDecimalSerializerSettings,
282+
streamReadConstraints: StreamReadConstraints = JsonConfig.defaultStreamReadConstraints
245283
) extends JsonConfig {
246284
override def bigDecimalParseConfig: BigDecimalParseConfig = bigDecimalParseSettings
247285

play-json/jvm/src/main/scala/play/api/libs/json/jackson/JacksonJson.scala

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import scala.collection.mutable
1313
import scala.collection.mutable.ArrayBuffer
1414
import scala.collection.mutable.ListBuffer
1515

16-
import com.fasterxml.jackson.core.JsonFactory
16+
import com.fasterxml.jackson.core.JsonFactoryBuilder
1717
import com.fasterxml.jackson.core.JsonGenerator
1818
import com.fasterxml.jackson.core.JsonParser
1919
import com.fasterxml.jackson.core.JsonTokenId
@@ -25,6 +25,7 @@ import com.fasterxml.jackson.databind.Module.SetupContext
2525
import com.fasterxml.jackson.databind._
2626
import com.fasterxml.jackson.databind.`type`.TypeFactory
2727
import com.fasterxml.jackson.databind.deser.Deserializers
28+
import com.fasterxml.jackson.databind.json.JsonMapper
2829
import com.fasterxml.jackson.databind.module.SimpleModule
2930
import com.fasterxml.jackson.databind.ser.Serializers
3031

@@ -219,7 +220,7 @@ private[jackson] class JsValueDeserializer(factory: TypeFactory, klass: Class[?]
219220

220221
case JsonTokenId.ID_FIELD_NAME =>
221222
parserContext match {
222-
case (c: ReadingMap) :: stack => (None, c.setField(jp.getCurrentName) +: stack)
223+
case (c: ReadingMap) :: stack => (None, c.setField(jp.currentName()) +: stack)
223224
case _ => throw new RuntimeException("We should be reading map, something got wrong")
224225
}
225226

@@ -282,9 +283,13 @@ private[json] object JacksonJson {
282283
}
283284

284285
private[json] case class JacksonJson(jsonConfig: JsonConfig) {
285-
private val mapper = (new ObjectMapper).registerModule(new PlayJsonMapperModule(jsonConfig))
286-
287-
private val jsonFactory = new JsonFactory(mapper)
286+
private val jsonFactory = new JsonFactoryBuilder()
287+
.streamReadConstraints(jsonConfig.streamReadConstraints)
288+
.build()
289+
private val mapper = JsonMapper
290+
.builder(jsonFactory)
291+
.addModule(new PlayJsonMapperModule(jsonConfig))
292+
.build()
288293

289294
private def stringJsonGenerator(out: java.io.StringWriter) =
290295
jsonFactory.createGenerator(out)

0 commit comments

Comments
 (0)