Skip to content

Commit 516d96e

Browse files
committed
JsonNullableSerializer støtter nå root values
1 parent 31e520f commit 516d96e

File tree

5 files changed

+79
-48
lines changed

5 files changed

+79
-48
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ Samling av fellesbiblioteker for DigiHoT.
2323

2424
Nye versjoner av alle biblioteker publiseres ved push til main.
2525

26+
## Migrering fra Jackson 2 til 3
27+
28+
1. Endre alle importer fra `com.fasterxml.jackson.*` til `tools.jackson.*`, bortsett fra
29+
`com.fasterxml.jackson.annotation.*`.
30+
2. Fjern bruk av `JavaTimeModule`, den er nå med som default siden Jackson 3.0 krever JDK >= 17.
31+
3. TODO
32+
2633
## Oracle
2734

2835
```bash

core/src/jacksonTest/kotlin/no/nav/hjelpemidler/domain/serialization/JsonNullableJacksonTest.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import no.nav.hjelpemidler.domain.person.Fødselsnummer
99
import no.nav.hjelpemidler.domain.person.år
1010
import no.nav.hjelpemidler.serialization.jackson.jsonToValue
1111
import no.nav.hjelpemidler.serialization.jackson.valueToJson
12+
import no.nav.hjelpemidler.text.doubleQuoted
1213
import java.util.UUID
1314
import kotlin.test.Test
1415

@@ -56,6 +57,13 @@ class JsonNullableJacksonTest {
5657
valueToJson(request) shouldBe json
5758
}
5859

60+
@Test
61+
fun `Root value`() {
62+
valueToJson(JsonNullable.Undefined) shouldBe "null"
63+
valueToJson(JsonNullable.Null) shouldBe "null"
64+
valueToJson(JsonNullable.of("test")) shouldBe "test".doubleQuoted()
65+
}
66+
5967
@JsonInclude(JsonInclude.Include.NON_EMPTY)
6068
data class TestRequest(
6169
val id: JsonNullable<UUID>,

core/src/main/kotlin/no/nav/hjelpemidler/domain/kodeverk/KodeverkJackson.kt

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,35 @@ import tools.jackson.databind.exc.InvalidFormatException
1010
import tools.jackson.databind.type.LogicalType
1111

1212
internal class KodeverkDeserializer : StdScalarDeserializer<Kodeverk<*>> {
13-
private val valueType: JavaType?
14-
private val valueDeserializer: ValueDeserializer<*>?
13+
private val enumType: JavaType?
14+
private val enumDeserializer: ValueDeserializer<*>?
1515

1616
constructor() : super(Kodeverk::class.java) {
17-
this.valueType = null
18-
this.valueDeserializer = null
17+
this.enumType = null
18+
this.enumDeserializer = null
1919
}
2020

2121
constructor(
2222
source: KodeverkDeserializer,
23-
valueType: JavaType,
24-
valueDeserializer: ValueDeserializer<*>,
23+
enumType: JavaType,
24+
enumDeserializer: ValueDeserializer<*>,
2525
) : super(source) {
26-
this.valueType = valueType
27-
this.valueDeserializer = valueDeserializer
26+
this.enumType = enumType
27+
this.enumDeserializer = enumDeserializer
2828
}
2929

3030
override fun createContextual(context: DeserializationContext, property: BeanProperty?): ValueDeserializer<*> {
31-
val type = property?.type ?: context.contextualType
32-
val valueType = type.containedTypeOrUnknown(0)
33-
val valueDeserializer = context.findContextualValueDeserializer(valueType, null)
34-
if (valueType == this.valueType && valueDeserializer == this.valueDeserializer) return this
35-
return KodeverkDeserializer(this, valueType, valueDeserializer)
31+
val parentType = property?.type ?: context.contextualType
32+
val enumType = parentType.containedTypeOrUnknown(0)
33+
val enumDeserializer = context.findContextualValueDeserializer(enumType, property)
34+
if (enumType == this.enumType && enumDeserializer == this.enumDeserializer) return this
35+
return KodeverkDeserializer(this, enumType, enumDeserializer)
3636
}
3737

3838
override fun deserialize(parser: JsonParser, context: DeserializationContext): Kodeverk<*> {
39-
checkNotNull(valueDeserializer)
39+
checkNotNull(enumDeserializer)
4040
return try {
41-
valueDeserializer.deserialize(parser, context) as Kodeverk<*>
41+
enumDeserializer.deserialize(parser, context) as Kodeverk<*>
4242
} catch (e: InvalidFormatException) {
4343
UkjentKode(e.value.toString())
4444
}

core/src/main/kotlin/no/nav/hjelpemidler/domain/serialization/JsonNullableJackson.kt

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,55 @@ import tools.jackson.databind.ValueDeserializer
1010
import tools.jackson.databind.ValueSerializer
1111
import tools.jackson.databind.deser.std.StdDeserializer
1212
import tools.jackson.databind.ser.std.StdSerializer
13+
import java.math.BigDecimal
14+
import java.math.BigInteger
1315

1416
internal class JsonNullableSerializer : StdSerializer<JsonNullable<*>> {
15-
private val valueType: JavaType?
16-
private val valueSerializer: ValueSerializer<Any?>?
17+
private val childType: JavaType?
18+
private val childSerializer: ValueSerializer<Any?>?
1719

1820
constructor() : super(JsonNullable::class.java) {
19-
this.valueType = null
20-
this.valueSerializer = null
21+
this.childType = null
22+
this.childSerializer = null
2123
}
2224

2325
constructor(
2426
source: JsonNullableSerializer,
25-
valueType: JavaType,
26-
valueSerializer: ValueSerializer<Any?>,
27+
childType: JavaType,
28+
childSerializer: ValueSerializer<Any?>,
2729
) : super(source) {
28-
this.valueType = valueType
29-
this.valueSerializer = valueSerializer
30+
this.childType = childType
31+
this.childSerializer = childSerializer
3032
}
3133

3234
override fun createContextual(context: SerializationContext, property: BeanProperty?): ValueSerializer<*> {
33-
val type = property?.type ?: TODO()
34-
val valueType = type.containedTypeOrUnknown(0)
35-
val valueSerializer = context.findValueSerializer(valueType)
36-
if (valueType == this.valueType && valueSerializer == this.valueSerializer) return this
37-
return JsonNullableSerializer(this, valueType, valueSerializer)
35+
val parentType = property?.type ?: return this
36+
val childType = parentType.containedTypeOrUnknown(0)
37+
val childSerializer = context.findValueSerializer(childType)
38+
if (childType == this.childType && childSerializer == this.childSerializer) return this
39+
return JsonNullableSerializer(this, childType, childSerializer)
3840
}
3941

4042
override fun serialize(value: JsonNullable<Any?>, generator: JsonGenerator, context: SerializationContext) {
4143
if (value !is JsonNullable.Present || value.value == null) {
4244
generator.writeNull()
45+
} else if (childSerializer == null) {
46+
when (value.value) {
47+
is Boolean -> generator.writeBoolean(value.value)
48+
49+
is String -> generator.writeString(value.value)
50+
51+
is Int -> generator.writeNumber(value.value)
52+
is Long -> generator.writeNumber(value.value)
53+
is Float -> generator.writeNumber(value.value)
54+
is Double -> generator.writeNumber(value.value)
55+
is BigInteger -> generator.writeNumber(value.value)
56+
is BigDecimal -> generator.writeNumber(value.value)
57+
58+
else -> generator.writePOJO(value.value)
59+
}
4360
} else {
44-
checkNotNull(valueSerializer)
45-
valueSerializer.serialize(value.value, generator, context)
61+
childSerializer.serialize(value.value, generator, context)
4662
}
4763
}
4864

@@ -51,34 +67,34 @@ internal class JsonNullableSerializer : StdSerializer<JsonNullable<*>> {
5167
}
5268

5369
internal class JsonNullableDeserializer : StdDeserializer<JsonNullable<*>> {
54-
private val valueType: JavaType?
55-
private val valueDeserializer: ValueDeserializer<*>?
70+
private val childType: JavaType?
71+
private val childDeserializer: ValueDeserializer<*>?
5672

5773
constructor() : super(JsonNullable::class.java) {
58-
this.valueType = null
59-
this.valueDeserializer = null
74+
this.childType = null
75+
this.childDeserializer = null
6076
}
6177

6278
constructor(
6379
source: JsonNullableDeserializer,
64-
valueType: JavaType,
65-
valueDeserializer: ValueDeserializer<*>,
80+
childType: JavaType,
81+
childDeserializer: ValueDeserializer<*>,
6682
) : super(source) {
67-
this.valueType = valueType
68-
this.valueDeserializer = valueDeserializer
83+
this.childType = childType
84+
this.childDeserializer = childDeserializer
6985
}
7086

7187
override fun createContextual(context: DeserializationContext, property: BeanProperty?): ValueDeserializer<*> {
72-
val type = property?.type ?: context.contextualType
73-
val valueType = type.containedTypeOrUnknown(0)
74-
val valueDeserializer = context.findContextualValueDeserializer(valueType, null)
75-
if (valueType == this.valueType && valueDeserializer == this.valueDeserializer) return this
76-
return JsonNullableDeserializer(this, valueType, valueDeserializer)
88+
val parentType = property?.type ?: context.contextualType
89+
val childType = parentType.containedTypeOrUnknown(0)
90+
val childDeserializer = context.findContextualValueDeserializer(childType, property)
91+
if (childType == this.childType && childDeserializer == this.childDeserializer) return this
92+
return JsonNullableDeserializer(this, childType, childDeserializer)
7793
}
7894

7995
override fun deserialize(parser: JsonParser, context: DeserializationContext): JsonNullable<*> {
80-
checkNotNull(valueDeserializer)
81-
val value = valueDeserializer.deserialize(parser, context)
96+
checkNotNull(childDeserializer)
97+
val value = childDeserializer.deserialize(parser, context)
8298
return JsonNullable.Present(value)
8399
}
84100

gradle/libs.versions.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ confluent = "8.2.0"
1313
contractPdlAvro = "1.0.3"
1414
cyclonedx = "3.2.0"
1515
ehcache = "3.11.1"
16-
flyway = "12.0.3"
16+
flyway = "12.1.0"
1717
graphql = "9.0.0"
1818
graphql-java = "25.0"
1919
h2 = "2.4.240"
@@ -30,7 +30,7 @@ jsoup = "1.22.1"
3030
junit = "6.0.3"
3131
kafka = "4.2.0"
3232
konfig = "1.6.10.0"
33-
kotest = "6.1.4"
33+
kotest = "6.1.5"
3434
kotest-ktor = "2.0.0"
3535
kotlin = "2.3.10"
3636
kotlin-logging = "8.0.01"
@@ -43,7 +43,7 @@ lettuce = "7.5.0.RELEASE"
4343
logback = "1.5.32"
4444
logback-logstash = "9.0"
4545
logback-syslog4j = "1.0.0"
46-
micrometer = "1.16.3"
46+
micrometer = "1.16.4"
4747
microprofile = "4.1.1"
4848
mockk = "1.14.9"
4949
mustache = "0.9.14"

0 commit comments

Comments
 (0)