
์์ ๊ฐ์ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๊ฐ์ฒด๋ก ๋ณํ
๊ธฐ๋ํ ๊ฐ์ฒด ํ์์ ์๋์ ๊ฐ๋ค.
Payload(id = "...", payload = List(Map("..." to "..."))
์๋ ์ฝ๋๋ก ํ์ฑ ์งํ
/* build.gradle.kts */
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
/* parsing logic */
jacksonObjectMapper().readValue(msg, PayLoad::class.java)
ํ์ง๋ง
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type java.util.ArrayList<java.util.Map<java.lang.String,java.lang.Object>>
from String value (token JsonToken.VALUE_STRING
)
์ด๋ ๊ฒ ํ์ฑ์๋ฌ๊ฐ ๋จ์ด์ง๋ค ใ ใ
์ฌ๋ฌ ์ฝ์ง์ ํด๋ณด๋,
ํ์ฌ๋ payload value๊ฐ์ด String ๊ทธ ์์ฒด๋ก ๋ค์ด์ค๋ ์ค์ด์๋ค.
์ฆ, ์๊ฐ ์๋๋ผ

์ด๋ฐ ํ์์ด์ด์ผ List์ Map์ ์ ํํ ์ธ์ ํ ์ ์๋ค.
๋ง์ฝ, Request๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ฉด ์ธ์ํ ์ ์๋๋ก JsonDeserializer๋ฅผ ๊ตฌํํ์!
์ฐ์ ํด๋์ค๋ฅผ ์์ฑํ๊ณ , JsonDeserializer๋ฅผ ์์๋ฐ๋๋ค. ์ด๋ ์ ๋ค๋ฆญ ํ์ ์ ์์ ์ด ์ต์ข ์ ์ผ๋ก ์ป๊ณ ์ํ๋ ๊ฐ์ฒด ํ์ ์ ๋ฃ์ผ๋ฉด ๋๋ค!
ํ์ฌ์ ๊ฒฝ์ฐ List<Map<?, ?> ํ์์ ์ป๊ณ ์ ํ๋ฏ๋ก ์๋์ ๊ฐ์ด ์์ฑ
class PayloadDeserializer: JsonDeserializer<List<Map<String, Any?>>>()
๊ทธ๋ฌ๋ฉด ์ธํ ๋ฆฌ์ ์ด๊ฐ ์๋์ผ๋ก overrideํ ํจ์๋ฅผ ์์ฑํด์ค๋ค.
์ ๋ฌ๋ฐ์ String์ JsonParser์ text๋ก ์กด์ฌํ๊ณ ์๋ค.
ํ์ฌ๋ Text๋ฅผ ํ๋ฒ ๋ ํ์ฑ ํด์ฃผ๊ณ ์ด๋ฅผ List<Map<>> ํํ๋ก ์บ์คํ ํ ๊ฐ์ ๋ฐ๋๋ก ํ์๋ค.
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): List<Map<String, Any?>> {
val listString = jacksonObjectMapper().readValue(p?.text, List::class.java)
return listString as List<Map<String, Any?>>
}
์์ฑ๋ Deserializer๋ ์๋์ ๊ฐ๋ค.
class PayloadDeserializer: JsonDeserializer<List<Map<String, Any?>>>() {
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): List<Map<String, Any?>> {
val listString = jacksonObjectMapper.readValue(p?.text, List::class.java)
return listString as List<Map<String, Any?>>
}
}
์ด์ ํด๋น ํ๋์ ์ ์ฉ์ํจ๋ค.
@JsonDeserialize(using = PayloadDeserializer::class)
์ด๋ ธํ ์ด์ ๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค!
data class PayloadRequest (
val footprintId: String,
@JsonDeserialize(using = PayloadDeserializer::class)
val payload: List<Map<String, Any?>>
)
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด, ์์ฃผ ๊น๋ํ๊ฒ ์ํ๋ ๊ฐ์ ์ป์ ์ ์๋ค!!!!!
'๐ป ๊ฐ๋ฐ ์ผ์ง > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] Scavenger ์ ์ฉ๊ธฐ (๋ฐ๋์ฝ๋ ๋ถ์ ํด) (0) | 2023.07.23 |
---|---|
[SpringBoot/Kotlin] Caffeine Cache ์ฌ์ฉํ๊ธฐ (LocalCache) (0) | 2023.06.19 |
[SpringBoot] Kafka ์ฐ๋(docker) ๋ฐ Consumer ๊ตฌํํ๊ธฐ (0) | 2023.01.11 |
[Spring Boot] Custom Exception Response ๋ง๋ค๊ธฐ (0) | 2022.04.26 |
SpringBoot - Slack Bot ์ฐ๋ํ๊ธฐ (0) | 2022.04.05 |

์์ ๊ฐ์ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๊ฐ์ฒด๋ก ๋ณํ
๊ธฐ๋ํ ๊ฐ์ฒด ํ์์ ์๋์ ๊ฐ๋ค.
Payload(id = "...", payload = List(Map("..." to "..."))
์๋ ์ฝ๋๋ก ํ์ฑ ์งํ
/* build.gradle.kts */
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
/* parsing logic */
jacksonObjectMapper().readValue(msg, PayLoad::class.java)
ํ์ง๋ง
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type java.util.ArrayList<java.util.Map<java.lang.String,java.lang.Object>>
from String value (token JsonToken.VALUE_STRING
)
์ด๋ ๊ฒ ํ์ฑ์๋ฌ๊ฐ ๋จ์ด์ง๋ค ใ ใ
์ฌ๋ฌ ์ฝ์ง์ ํด๋ณด๋,
ํ์ฌ๋ payload value๊ฐ์ด String ๊ทธ ์์ฒด๋ก ๋ค์ด์ค๋ ์ค์ด์๋ค.
์ฆ, ์๊ฐ ์๋๋ผ

์ด๋ฐ ํ์์ด์ด์ผ List์ Map์ ์ ํํ ์ธ์ ํ ์ ์๋ค.
๋ง์ฝ, Request๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ฉด ์ธ์ํ ์ ์๋๋ก JsonDeserializer๋ฅผ ๊ตฌํํ์!
์ฐ์ ํด๋์ค๋ฅผ ์์ฑํ๊ณ , JsonDeserializer๋ฅผ ์์๋ฐ๋๋ค. ์ด๋ ์ ๋ค๋ฆญ ํ์ ์ ์์ ์ด ์ต์ข ์ ์ผ๋ก ์ป๊ณ ์ํ๋ ๊ฐ์ฒด ํ์ ์ ๋ฃ์ผ๋ฉด ๋๋ค!
ํ์ฌ์ ๊ฒฝ์ฐ List<Map<?, ?> ํ์์ ์ป๊ณ ์ ํ๋ฏ๋ก ์๋์ ๊ฐ์ด ์์ฑ
class PayloadDeserializer: JsonDeserializer<List<Map<String, Any?>>>()
๊ทธ๋ฌ๋ฉด ์ธํ ๋ฆฌ์ ์ด๊ฐ ์๋์ผ๋ก overrideํ ํจ์๋ฅผ ์์ฑํด์ค๋ค.
์ ๋ฌ๋ฐ์ String์ JsonParser์ text๋ก ์กด์ฌํ๊ณ ์๋ค.
ํ์ฌ๋ Text๋ฅผ ํ๋ฒ ๋ ํ์ฑ ํด์ฃผ๊ณ ์ด๋ฅผ List<Map<>> ํํ๋ก ์บ์คํ ํ ๊ฐ์ ๋ฐ๋๋ก ํ์๋ค.
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): List<Map<String, Any?>> {
val listString = jacksonObjectMapper().readValue(p?.text, List::class.java)
return listString as List<Map<String, Any?>>
}
์์ฑ๋ Deserializer๋ ์๋์ ๊ฐ๋ค.
class PayloadDeserializer: JsonDeserializer<List<Map<String, Any?>>>() {
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): List<Map<String, Any?>> {
val listString = jacksonObjectMapper.readValue(p?.text, List::class.java)
return listString as List<Map<String, Any?>>
}
}
์ด์ ํด๋น ํ๋์ ์ ์ฉ์ํจ๋ค.
@JsonDeserialize(using = PayloadDeserializer::class)
์ด๋ ธํ ์ด์ ๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค!
data class PayloadRequest (
val footprintId: String,
@JsonDeserialize(using = PayloadDeserializer::class)
val payload: List<Map<String, Any?>>
)
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด, ์์ฃผ ๊น๋ํ๊ฒ ์ํ๋ ๊ฐ์ ์ป์ ์ ์๋ค!!!!!
'๐ป ๊ฐ๋ฐ ์ผ์ง > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] Scavenger ์ ์ฉ๊ธฐ (๋ฐ๋์ฝ๋ ๋ถ์ ํด) (0) | 2023.07.23 |
---|---|
[SpringBoot/Kotlin] Caffeine Cache ์ฌ์ฉํ๊ธฐ (LocalCache) (0) | 2023.06.19 |
[SpringBoot] Kafka ์ฐ๋(docker) ๋ฐ Consumer ๊ตฌํํ๊ธฐ (0) | 2023.01.11 |
[Spring Boot] Custom Exception Response ๋ง๋ค๊ธฐ (0) | 2022.04.26 |
SpringBoot - Slack Bot ์ฐ๋ํ๊ธฐ (0) | 2022.04.05 |