Skip to content

Commit d50f71d

Browse files
committed
article: json
1 parent 3f9ca86 commit d50f71d

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

_notes/Public/localdate-datumkezeles.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ type 'java.time.LocalDate' for property..`
1313

1414
# Megoldás
1515

16+
Először is szükség van pár dependency-re, pl. a LocalDate kezeléshez: [[Minimal JSON serialization setup]].
17+
1618
A POST kéréseknél megoldható a probléma, ha a request-ben az adott paramétert annotáljuk a
1719
következővel:
1820

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
---
2+
title: Minimal JSON serialization setup
3+
feed: show
4+
date: 25-10-2024
5+
---
6+
7+
>Bővebben: [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
8+
9+
10+
Ha egyedi dátumokat / adattípusokat szeretnénk serializálni / deserializálni, vagy nincs behúzva a projektbe a Spring Web, vagy default értékek nélküli osztályokat akarunk használni, pl:
11+
12+
```kotlin
13+
data class MyData(
14+
val persons: List<Person>,
15+
)
16+
17+
data class Person(
18+
val name: String,
19+
val birthDate: LocalDate,
20+
)
21+
```
22+
23+
akkor serializáláskor különböző hibákat kaphatunk, pl `No serializer found for class java.time.LocalDate` vagy `Cannot construct instance of java.time.LocalDate (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2024-10-25')`, vagy `Cannot construct instance of MyData (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)`.
24+
25+
Ezek megoldására a legegyszerűbb megoldás, ha behúzzuk a következő dependency-ket:
26+
27+
```kotlin
28+
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
29+
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
30+
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8")
31+
```
32+
33+
Fontos, hogy az ObjectMapper Bean-ben be legyenek a megfelelő modulok regisztrálva:
34+
35+
```kotlin
36+
37+
@Configuration
38+
class JacksonConfig {
39+
40+
@Bean
41+
fun objectMapper(): ObjectMapper {
42+
JsonMapper.builder()
43+
.registerModule(JavaTimeModule())
44+
.registerModule(Jdk8Module())
45+
.build()
46+
}
47+
}
48+
```
49+
50+
Ha nem akarunk egyesével modulokat regisztrálni, akkor a findAndAddModules() metódus segítségével is megoldható:
51+
52+
```kotlin
53+
@Configuration
54+
55+
class JacksonConfig {
56+
57+
@Bean
58+
fun objectMapper(): ObjectMapper {
59+
JsonMapper.builder().findAndAddModules().build()
60+
}
61+
}
62+
```
63+
64+
> A két megoldás közül CSAK az egyik használható. Ha hagyatkozunk az automatikus és kézi beállításra is, akkor csak az egyik fog érvényesülni.
65+
66+
Fontos, hogy mindneképp regisztráljuk be a KotlinModule-t is:
67+
68+
```kotlin
69+
object JacksonConfig {
70+
71+
@Bean
72+
fun objectMapper(): ObjectMapper {
73+
JsonMapper.builder().findAndAddModules()
74+
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, SerializationFeature.WRITE_DATES_WITH_ZONE_ID)
75+
.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES).enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES)
76+
.enable(StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION)
77+
.build().registerKotlinModule()
78+
}
79+
}
80+
```
81+

0 commit comments

Comments
 (0)