Skip to content

Commit d351b1b

Browse files
committed
1 parent ccf0037 commit d351b1b

File tree

7 files changed

+273
-0
lines changed

7 files changed

+273
-0
lines changed

gradle/libs.versions.toml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ assertj = "3.24.2"
44
dependency-analysis-gradle-plugin = "1.20.0"
55
equalsverifier = "3.11.1"
66
jetbrains-annotations = "23.0.0"
7+
jackson = "2.14.2"
8+
jackson-kogera = "2.14.2-alpha7"
79
jakarta-inject = "2.0.0"
810
junit = "5.9.3" # Duplicated in unit-test-suite.gradle.kts.
911
kotlin = "1.8.10" # See also `kotlinTargetVersion` in kotlin-project.gradle.kts.
@@ -31,6 +33,18 @@ version.ref = "dependency-analysis-gradle-plugin"
3133
module = "nl.jqno.equalsverifier:equalsverifier"
3234
version.ref = "equalsverifier"
3335

36+
[libraries.jackson-bom]
37+
module = "com.fasterxml.jackson:jackson-bom"
38+
version.ref = "jackson"
39+
40+
[libraries.jackson-module-kogera]
41+
module = "com.github.ProjectMapK:jackson-module-kogera"
42+
version.ref = "jackson-kogera"
43+
44+
[libraries.jackson-module-kotlin]
45+
module = "com.fasterxml.jackson.module:jackson-module-kotlin"
46+
version.ref = "jackson"
47+
3448
[libraries.jakarta-inject]
3549
module = "jakarta.inject:jakarta.inject-api"
3650
version.ref = "jakarta-inject"
@@ -139,6 +153,10 @@ version.ref = "spring-boot"
139153
module = "org.springframework.boot:spring-boot-starter"
140154
version.ref = "spring-boot"
141155

156+
[libraries.spring-boot-starter-json]
157+
module = "org.springframework.boot:spring-boot-starter-json"
158+
version.ref = "spring-boot"
159+
142160
[libraries.spring-boot-starter-log4j2]
143161
module = "org.springframework.boot:spring-boot-starter-log4j2"
144162
version.ref = "spring-boot"
@@ -151,6 +169,10 @@ version.ref = "spring-boot"
151169
module = "org.springframework.boot:spring-boot-starter-webflux"
152170
version.ref = "spring-boot"
153171

172+
[libraries.spring-boot-test-autoconfigure]
173+
module = "org.springframework.boot:spring-boot-test-autoconfigure"
174+
version.ref = "spring-boot"
175+
154176
[libraries.spring-web]
155177
module = "org.springframework:spring-web"
156178
version.ref = "spring"

platforms/app-platform/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ javaPlatform {
1010

1111
dependencies {
1212

13+
api(platform(libs.jackson.bom))
1314
api(platform(libs.kotlinx.coroutines.bom))
1415
api(platform(libs.log4j.bom))
1516
api(platform(libs.spring.boot.bom))
1617

1718
constraints {
19+
api(libs.jackson.module.kogera)
1820
api(libs.jetbrains.annotations)
1921
api(libs.bundles.kotlinx.datetime.jvm)
2022
api(libs.bundles.log4j.kotlin)

settings.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ dependencyResolutionManagement {
1010
@Suppress("UnstableApiUsage")
1111
repositories {
1212
mavenCentral()
13+
maven { setUrl("https://jitpack.io") }
1314
}
1415
}
1516

@@ -22,5 +23,7 @@ includeBuild("platforms")
2223
include("subprojects:app")
2324
include("subprojects:child-context:domain-service")
2425
include("subprojects:child-context:rest-api")
26+
include("subprojects:kotlin-json:jackson")
27+
include("subprojects:kotlin-json:kogera")
2528
include("subprojects:time-logger")
2629
include("subprojects:time-service")
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugins {
2+
id("org.sdkotlin.buildlogic.spring-project")
3+
}
4+
5+
dependencies {
6+
7+
integrationTestImplementation(libs.jackson.module.kotlin)
8+
integrationTestImplementation(libs.spring.boot.starter.json)
9+
integrationTestImplementation(libs.spring.boot.starter.test)
10+
integrationTestImplementation(libs.spring.boot.test.autoconfigure)
11+
integrationTestImplementation(libs.spring.context)
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package org.sdkotlin.springdemo.kotlin.json.jackson
2+
3+
import org.assertj.core.api.Assertions.assertThat
4+
import org.assertj.core.api.ThrowingConsumer
5+
import org.junit.jupiter.api.Disabled
6+
import org.junit.jupiter.api.Test
7+
import org.springframework.beans.factory.annotation.Autowired
8+
import org.springframework.boot.test.autoconfigure.json.JsonTest
9+
import org.springframework.boot.test.json.JacksonTester
10+
import org.springframework.boot.test.json.JsonContent
11+
import org.springframework.context.annotation.Configuration
12+
13+
@JsonTest
14+
internal class JacksonKotlinUnsignedIT(
15+
@Autowired
16+
val signedTypesJacksonTester: JacksonTester<SignedTypesEntity>,
17+
@Autowired
18+
val unsignedTypesJacksonTester: JacksonTester<UnsignedTypesEntity>,
19+
) {
20+
21+
@Configuration
22+
internal class TestConfig
23+
24+
@Test
25+
fun `test signed value serialization`() {
26+
27+
val signedTypesEntity =
28+
SignedTypesEntity(
29+
signedInteger = 1,
30+
signedLong = 2,
31+
)
32+
33+
val signedTypesJsonContent: JsonContent<SignedTypesEntity> =
34+
signedTypesJacksonTester.write(signedTypesEntity)
35+
36+
assertThat(signedTypesJsonContent)
37+
.extractingJsonPathNumberValue("$.signedInteger")
38+
.isEqualTo(1)
39+
assertThat(signedTypesJsonContent)
40+
.extractingJsonPathNumberValue("$.signedLong")
41+
.satisfies(ThrowingConsumer { number ->
42+
assertThat(number.toLong()).isEqualTo(2L)
43+
})
44+
}
45+
46+
@Test
47+
fun `test signed value deserialization`() {
48+
49+
val signedTypesJson = """
50+
{
51+
"signedInteger": 1,
52+
"signedLong": 2
53+
}
54+
""".trimIndent()
55+
56+
val content: SignedTypesEntity =
57+
signedTypesJacksonTester.parseObject(signedTypesJson)
58+
59+
assertThat(content.signedInteger).isEqualTo(1)
60+
assertThat(content.signedLong).isEqualTo(2L)
61+
}
62+
63+
@Test
64+
fun `test unsigned value serialization`() {
65+
66+
val unsignedTypesEntity =
67+
UnsignedTypesEntity(
68+
unsignedInteger = 1u,
69+
unsignedLong = 2uL,
70+
)
71+
72+
val unsignedTypesJsonContent: JsonContent<UnsignedTypesEntity> =
73+
unsignedTypesJacksonTester.write(unsignedTypesEntity)
74+
75+
assertThat(unsignedTypesJsonContent)
76+
.extractingJsonPathNumberValue("$.unsignedInteger")
77+
.isEqualTo(1)
78+
assertThat(unsignedTypesJsonContent)
79+
.extractingJsonPathNumberValue("$.unsignedLong")
80+
.satisfies(ThrowingConsumer { number ->
81+
assertThat(number.toLong()).isEqualTo(2L)
82+
})
83+
}
84+
85+
@Test
86+
@Disabled("https://github.com/FasterXML/jackson-module-kotlin/issues/650")
87+
fun `test unsigned value deserialization`() {
88+
89+
val unsignedTypesJson = """
90+
{
91+
"unsignedInteger": 1,
92+
"unsignedLong": 2
93+
}
94+
""".trimIndent()
95+
96+
val content: UnsignedTypesEntity =
97+
unsignedTypesJacksonTester.parseObject(unsignedTypesJson)
98+
99+
assertThat(content.unsignedInteger).isEqualTo(1u)
100+
assertThat(content.unsignedLong).isEqualTo(2uL)
101+
}
102+
}
103+
104+
data class SignedTypesEntity(
105+
val signedInteger: Int,
106+
val signedLong: Long,
107+
)
108+
109+
data class UnsignedTypesEntity(
110+
val unsignedInteger: UInt,
111+
val unsignedLong: ULong,
112+
)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
plugins {
2+
id("org.sdkotlin.buildlogic.spring-project")
3+
}
4+
5+
dependencies {
6+
7+
integrationTestImplementation(libs.jackson.module.kogera)
8+
integrationTestImplementation(libs.spring.boot.starter.json)
9+
integrationTestImplementation(libs.spring.boot.starter.test)
10+
integrationTestImplementation(libs.spring.boot.test.autoconfigure)
11+
integrationTestImplementation(libs.spring.context)
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package org.sdkotlin.springdemo.kotlin.json.jackson
2+
3+
import org.assertj.core.api.Assertions.assertThat
4+
import org.assertj.core.api.ThrowingConsumer
5+
import org.junit.jupiter.api.Test
6+
import org.springframework.beans.factory.annotation.Autowired
7+
import org.springframework.boot.test.autoconfigure.json.JsonTest
8+
import org.springframework.boot.test.json.JacksonTester
9+
import org.springframework.boot.test.json.JsonContent
10+
import org.springframework.context.annotation.Configuration
11+
12+
@JsonTest
13+
internal class JacksonKogeraUnsignedIT(
14+
@Autowired
15+
val signedTypesJacksonTester: JacksonTester<SignedTypesEntity>,
16+
@Autowired
17+
val unsignedTypesJacksonTester: JacksonTester<UnsignedTypesEntity>,
18+
) {
19+
20+
@Configuration
21+
internal class TestConfig
22+
23+
@Test
24+
fun `test signed value serialization`() {
25+
26+
val signedTypesEntity =
27+
SignedTypesEntity(
28+
signedInteger = 1,
29+
signedLong = 2,
30+
)
31+
32+
val signedTypesJsonContent: JsonContent<SignedTypesEntity> =
33+
signedTypesJacksonTester.write(signedTypesEntity)
34+
35+
assertThat(signedTypesJsonContent)
36+
.extractingJsonPathNumberValue("$.signedInteger")
37+
.isEqualTo(1)
38+
assertThat(signedTypesJsonContent)
39+
.extractingJsonPathNumberValue("$.signedLong")
40+
.satisfies(ThrowingConsumer { number ->
41+
assertThat(number.toLong()).isEqualTo(2L)
42+
})
43+
}
44+
45+
@Test
46+
fun `test signed value deserialization`() {
47+
48+
val signedTypesJson = """
49+
{
50+
"signedInteger": 1,
51+
"signedLong": 2
52+
}
53+
""".trimIndent()
54+
55+
val content: SignedTypesEntity =
56+
signedTypesJacksonTester.parseObject(signedTypesJson)
57+
58+
assertThat(content.signedInteger).isEqualTo(1)
59+
assertThat(content.signedLong).isEqualTo(2L)
60+
}
61+
62+
@Test
63+
fun `test unsigned value serialization`() {
64+
65+
val unsignedTypesEntity =
66+
UnsignedTypesEntity(
67+
unsignedInteger = 1u,
68+
unsignedLong = 2uL,
69+
)
70+
71+
val unsignedTypesJsonContent: JsonContent<UnsignedTypesEntity> =
72+
unsignedTypesJacksonTester.write(unsignedTypesEntity)
73+
74+
assertThat(unsignedTypesJsonContent)
75+
.extractingJsonPathNumberValue("$.unsignedInteger")
76+
.isEqualTo(1)
77+
assertThat(unsignedTypesJsonContent)
78+
.extractingJsonPathNumberValue("$.unsignedLong")
79+
.satisfies(ThrowingConsumer { number ->
80+
assertThat(number.toLong()).isEqualTo(2L)
81+
})
82+
}
83+
84+
@Test
85+
fun `test unsigned value deserialization`() {
86+
87+
val unsignedTypesJson = """
88+
{
89+
"unsignedInteger": 1,
90+
"unsignedLong": 2
91+
}
92+
""".trimIndent()
93+
94+
val content: UnsignedTypesEntity =
95+
unsignedTypesJacksonTester.parseObject(unsignedTypesJson)
96+
97+
assertThat(content.unsignedInteger).isEqualTo(1u)
98+
assertThat(content.unsignedLong).isEqualTo(2uL)
99+
}
100+
}
101+
102+
data class SignedTypesEntity(
103+
val signedInteger: Int,
104+
val signedLong: Long,
105+
)
106+
107+
data class UnsignedTypesEntity(
108+
val unsignedInteger: UInt,
109+
val unsignedLong: ULong,
110+
)

0 commit comments

Comments
 (0)