Spring使用什么进行反序列化?
我有以下课程:Spring使用什么进行反序列化?,spring,kotlin,jackson,spring-webflux,Spring,Kotlin,Jackson,Spring Webflux,我有以下课程: data class Thing(val lines: List<String>) Spring WebFlux可以通过以下方法成功解析此问题: // Parse the JSON as an object and return it. request -> ServerResponse.ok().body(request.bodyToMono(Thing::class.java) 但是,使用Jackson直接使用以下任一技术都会失败: val mapper
data class Thing(val lines: List<String>)
Spring WebFlux可以通过以下方法成功解析此问题:
// Parse the JSON as an object and return it.
request -> ServerResponse.ok().body(request.bodyToMono(Thing::class.java)
但是,使用Jackson直接使用以下任一技术都会失败:
val mapper = ObjectMapper()
val item = mapper.readValue<Thing>("""{"lines":["something","something else"]}""")
错误是:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `Thing` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
我以为Spring是在用Jackson来完成它的转变。我认为Jackson可以处理JSON->POJO的基本转换。使用
@JsonDeserialize
类显然是有效的。那么为什么第一个示例有效而第二个不有效呢?Spring使用Jackson,但它在创建ObjectMapper的默认实例时注册了自定义处理程序和模块
Jackson对接受单个参数的构造函数有特殊处理。这样做是为了支持UUID和URI之类的类。要指示Jackson不要使用此技术,请使用@JsonCreator注释构造函数
data class Thing @JsonCreator constructor(val lines: List<String>)
data class Thing@JsonCreator构造函数(val行:列表)
我还没有看过Spring的反应式代码,所以我不知道它做了什么或者是否做了什么来禁用Jackson的特殊处理。Spring使用Jackson,但它在创建ObjectMapper的默认实例时注册了自定义处理程序和模块 Jackson对接受单个参数的构造函数有特殊处理。这样做是为了支持UUID和URI之类的类。要指示Jackson不要使用此技术,请使用@JsonCreator注释构造函数
data class Thing @JsonCreator constructor(val lines: List<String>)
data class Thing@JsonCreator构造函数(val行:列表)
我还没有查看Spring的反应式代码,所以我不知道它做了什么或是否做了什么来禁用Jackson的特殊处理。这个特殊处理包括什么?它可以用来做什么?为什么
bodyToMono
忽略了这个行为呢?如果我没记错的话,这个遗留的原因是您可以在第一个构造函数参数中以字符串形式传入完整的json对象,然后仅从该参数反序列化它。这样做是为了支持旧类和旧数据库。他们正在讨论在jackson 3.x中删除此项,此特殊处理包括哪些内容?它可以用来做什么?为什么bodyToMono
忽略了这个行为呢?如果我没记错的话,这个遗留的原因是您可以在第一个构造函数参数中以字符串形式传入完整的json对象,然后仅从该参数反序列化它。这样做是为了支持旧类和旧数据库。他们正在讨论在jackson 3.x中删除此项
data class Thing @JsonCreator constructor(val lines: List<String>)