kotlin:无法使用 Jackson 将字符串解析为枚举

sab*_*sab 0 jackson kotlin jackson-modules

我使用 lib jackson-module-kotlin 将 json 字符串解析为对象。

我的问题是,当我将字符串解析为 enum 时,当我使用 intellij 启动时,我有以下堆栈跟踪:

引起原因:kotlin.reflect.jvm.internal.KotlinReflectionInternalError:尚未完全支持内置 Kotlin 类型的反射。未找到公共最终 val 名称的元数据:kotlin.Enum[DeserializedPropertyDescriptor@212b316a] 中定义的 kotlin.String

我用maven启动的时候没有这个问题。

我使用 kotlin 1.1.51,使用 intellij kotlin 插件 1.2.0-release-IJ2017.3-1,我的目标是 JVM 1.8,我使用 jackson-module-kotlin 版本 2.8.7

我应该怎么办?

 enum class CType { DEAL, FILE }
 data class Code(val code: String, val type: CType)

 fun testDeserialization() {
    val mapper = jacksonObjectMapper()
    // following line throws an exception:
    mapper.readValue("""{"code":"A","type":"DEAL"}""", Code::class.java)
 }
Run Code Online (Sandbox Code Playgroud)

Kir*_*kov 5

我让它工作的唯一方法是添加额外的@JvmStatic注释。我mapper.registerModule(new KotlinModule());什么都没有,除了这个:

package nc.features.algo.model

import com.fasterxml.jackson.annotation.JsonCreator
import com.fasterxml.jackson.annotation.JsonValue

enum class LHStatus (
  @get:JsonValue val code: Int
) {
  LH_POS_OVU_WAITING(1),
  LH_NEG_OVU_WAITING(2),
  ;

  companion object {
    @JsonCreator
    @JvmStatic
    fun deser(code: Int?): LHStatus? {
      if (code == null) return null
      for (i in values()) {
         if (i.code == code) return i
      }
      return null
    }
  }
}

Run Code Online (Sandbox Code Playgroud)