home wiki.fukuchiharuki.me
Menu

#author("2023-03-08T07:49:57+00:00","default:haruki","haruki")
* キーワード [#p061e194]
- Jackson
- XML
- Kotlin
- data class

* 現象 [#j4eb3fbe]

Jacksonで次のようなXML上のコレクションをKotlinのデータクラスにデシリアライズできない。

 <example>
   <elements>
     <element>...</element>
   </elements>
 </example>

次のエラーメッセージを得る。

 could not find creator property with name ...

* 原因 [#wf9102c6]

データクラスを次のようには定義できない。

 @JacksonXmlRootElement(localName = "example")
 data class Example(
   @field: JacksonXmlElementWrapper(localName = "elements")
   @field: JacksonXmlProperty(localName = "element")
   val elements: List<Element> = emptyList()
 )

* 対策 [#xfc0307c]

コンストラクタ引数で該当のプロパティ(コレクション)の分を定義しない。

 @JacksonXmlRootElement(localName = "example")
 data class Example(
   private var elements: List<Element> = emptyList()
 ) {
   @get: JacksonXmlElementWrapper(localName = "elements")
   @get: JacksonXmlProperty(localName = "element")
   var elements
     set(value) { _elements = value }
     get() = _elements
 }

* 備考 [#v85b23bd]

- コレクションでないプロパティはこのようにする必要はない

* 参考 [#v16e14de]
- [[@JacksonXmlElementWrapper doesn’t work with data classes · Issue #153 · FasterXML/jackson-module-kotlin:https://github.com/FasterXML/jackson-module-kotlin/issues/153#issuecomment-500071067]]