ObjectMapper反序列化MyErrorMessage报错无字符串参数构造方法如何解决
问题原因
你遇到的反序列化错误是以下几个问题共同导致的:
- 首先JSON结构中
errorMessage字段存在两种异构类型:datadetail层级下的errorMessage是字符串类型:"errorMessage": "ERROR with aKey"aTypes子元素中的errorMessage是对象类型:"errorMessage": {"message": "Not found"}
- Jackson解析
datadetail.errorMessage时,需要将字符串反序列化为你定义的MyErrorMessage对象,虽然你已经声明了单String参数的构造函数,但存在两个问题导致Jackson无法识别该构造函数:- 你没有为ObjectMapper注册Kotlin模块,Jackson默认无法识别Kotlin类的构造函数、数据类等特性
- 没有显式标记该单参数构造函数为Jackson的反序列化创建器
- 除此之外你的代码还有几个隐藏问题也会导致后续反序列化失败:
StatusType枚举只定义了OK、ERROR两个值,但JSON中datadetail.status取值为ONE,会报枚举值不匹配错误TypesResponse中字段命名为errMessage,但JSON对应字段名为errorMessage,会导致映射失败字段为null- 代码存在笔误:你定义的ObjectMapper变量名为
objectMapper,调用时写为objectmapper(大小写错误);方法入参是responseMessage,调用readValue时传的是不存在的message变量 - 你代码里用到的
Instant、自定义类型MyKey、MyBKey、MyCKey如果没有对应的反序列化器也会报错
修复方案
- 首先添加
jackson-module-kotlin依赖(如果未添加),构造ObjectMapper时注册Kotlin模块,同时可配置反序列化特性避免后续错误:
val objectMapper = ObjectMapper() .registerModule(KotlinModule.Builder().build()) // 可选配置:遇到未知枚举值时转为null,不会直接报错 .configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true)
- 给
MyErrorMessage的单String参数构造函数添加@JsonCreator注解,显式告诉Jackson该构造函数用于从字符串值反序列化:
data class MyErrorMessage( @JsonProperty("message") val message: String, @JsonProperty("context") val context: MyContext?, ){ @JsonCreator // 新增注解 constructor(message: String) : this( message = message, context = null ) // 枚举定义不变 }
- 修正
StatusType枚举,添加缺失的ONE值:
enum class StatusType{ OK, ERROR, ONE // 新增 }
- 修正
TypesResponse的字段映射,要么改字段名要么加JsonProperty注解:
data class TypesResponse( val bKey: MyBKey, val cKey: MyCKey, val status: StatusType, @JsonProperty("errorMessage") // 新增注解 val errMessage: MyErrorMessage? = null )
- 修正代码笔误,调用readValue时使用正确的变量名和参数:
return objectMapper.readValue(responseMessage, MyResponse::class.java)
内容的提问来源于stack exchange,提问作者inconnu
相关产品推荐
相关产品推荐

