Skip to content

Commit 1fc0bc0

Browse files
authored
Merge pull request #391 from hiddewie/dsl-2.12
Add Kotlin DSL for constructing JsonMapper and KotlinModule
2 parents 1a56f8b + 797d9e2 commit 1fc0bc0

File tree

3 files changed

+107
-2
lines changed

3 files changed

+107
-2
lines changed

README.md

+14
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ To use, just register the Kotlin module with your ObjectMapper instance:
3838

3939
```kotlin
4040
val mapper = ObjectMapper().registerModule(KotlinModule())
41+
// or with 2.10 and later
42+
val mapper = JsonMapper.builder().addModule(KotlinModule()).build()
43+
// or with 2.12 and later
44+
val mapper = jsonMapper {
45+
addModule(kotlinModule())
46+
}
47+
4148
```
4249

4350
or with the extension functions imported from `import com.fasterxml.jackson.module.kotlin.*`, one of:
@@ -110,6 +117,13 @@ The Kotlin module may be given a few configuration parameters at construction ti
110117
val mapper = JsonMapper.builder()
111118
.addModule(KotlinModule(strictNullChecks = true))
112119
.build()
120+
121+
// Or, from version 2.12
122+
val mapper = jsonMapper {
123+
addModule(kotlinModule {
124+
strictNullChecks(true)
125+
})
126+
}
113127
```
114128

115129
If your `ObjectMapper` is constructed in Java, there is a builder method provided for configuring these options:

src/main/kotlin/com/fasterxml/jackson/module/kotlin/Extensions.kt

+17-2
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,29 @@ import com.fasterxml.jackson.databind.ObjectReader
1010
import com.fasterxml.jackson.databind.module.SimpleModule
1111
import com.fasterxml.jackson.databind.JsonDeserializer
1212
import com.fasterxml.jackson.databind.JsonSerializer
13+
import com.fasterxml.jackson.databind.json.JsonMapper
1314
import java.io.File
1415
import java.io.InputStream
1516
import java.io.Reader
1617
import java.net.URL
1718
import kotlin.reflect.KClass
1819

19-
fun jacksonObjectMapper(): ObjectMapper = ObjectMapper().registerKotlinModule()
20-
fun ObjectMapper.registerKotlinModule(): ObjectMapper = this.registerModule(KotlinModule())
20+
fun kotlinModule(initializer: KotlinModule.Builder.() -> Unit = {}): KotlinModule {
21+
val builder = KotlinModule.Builder()
22+
builder.initializer()
23+
return builder.build()
24+
}
25+
26+
fun jsonMapper(initializer: JsonMapper.Builder.() -> Unit = {}): JsonMapper {
27+
val builder = JsonMapper.builder()
28+
builder.initializer()
29+
return builder.build()
30+
}
31+
32+
fun jacksonObjectMapper(): ObjectMapper = jsonMapper { addModule(kotlinModule()) }
33+
fun jacksonMapperBuilder(): JsonMapper.Builder = JsonMapper.builder().addModule(kotlinModule())
34+
35+
fun ObjectMapper.registerKotlinModule(): ObjectMapper = this.registerModule(kotlinModule())
2136

2237
inline fun <reified T> jacksonTypeRef(): TypeReference<T> = object: TypeReference<T>() {}
2338

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.fasterxml.jackson.module.kotlin
2+
3+
import com.fasterxml.jackson.core.json.JsonReadFeature
4+
import com.fasterxml.jackson.core.json.JsonWriteFeature
5+
import com.fasterxml.jackson.module.kotlin.SingletonSupport.CANONICALIZE
6+
import org.junit.Assert.assertNotNull
7+
import org.junit.Test
8+
import kotlin.test.assertEquals
9+
import kotlin.test.assertFalse
10+
import kotlin.test.assertTrue
11+
12+
class DslTest {
13+
14+
@Test
15+
fun createModuleWithoutUsingInitializer() {
16+
val module = kotlinModule()
17+
assertNotNull(module)
18+
}
19+
20+
@Test
21+
fun createModuleWithEmptyInitializer() {
22+
val module = kotlinModule {}
23+
assertNotNull(module)
24+
}
25+
26+
@Test
27+
fun createModuleWithBuilderOptions() {
28+
val module = kotlinModule {
29+
reflectionCacheSize(123)
30+
nullToEmptyCollection(true)
31+
nullToEmptyMap(true)
32+
nullIsSameAsDefault(true)
33+
singletonSupport(CANONICALIZE)
34+
strictNullChecks(true)
35+
}
36+
37+
assertNotNull(module)
38+
assertEquals(module.reflectionCacheSize, 123)
39+
assertTrue(module.nullToEmptyCollection)
40+
assertTrue(module.nullToEmptyMap)
41+
assertTrue(module.nullIsSameAsDefault)
42+
assertEquals(module.singletonSupport, CANONICALIZE)
43+
assertTrue(module.strictNullChecks)
44+
}
45+
46+
@Test
47+
fun createJsonMapperWithoutUsingInitializer() {
48+
val mapper = jsonMapper()
49+
assertNotNull(mapper)
50+
}
51+
52+
@Test
53+
fun creatJsonMappereWithEmptyInitializer() {
54+
val mapper = jsonMapper {}
55+
assertNotNull(mapper)
56+
}
57+
58+
@Test
59+
fun creatJsonMappereWithBuilderOptions() {
60+
val mapper = jsonMapper {
61+
enable(JsonReadFeature.ALLOW_JAVA_COMMENTS)
62+
disable(JsonWriteFeature.QUOTE_FIELD_NAMES)
63+
configure(JsonReadFeature.ALLOW_SINGLE_QUOTES, true)
64+
65+
addModule(kotlinModule {
66+
nullIsSameAsDefault(true)
67+
})
68+
}
69+
70+
assertNotNull(mapper)
71+
assertTrue(mapper.isEnabled(JsonReadFeature.ALLOW_JAVA_COMMENTS))
72+
assertFalse(mapper.isEnabled(JsonWriteFeature.QUOTE_FIELD_NAMES))
73+
assertTrue(mapper.isEnabled(JsonReadFeature.ALLOW_SINGLE_QUOTES))
74+
assertTrue(mapper.registeredModuleIds.any { it == "com.fasterxml.jackson.module.kotlin.KotlinModule" })
75+
}
76+
}

0 commit comments

Comments
 (0)