如何避免创建新的 ObjectMapper 实例,每个来自外部系统的类型响应都由 Jackson 接收和解析?



我正在开发一个应用程序,它调用外部系统的REST API并使用Jackson映射响应。DTO如下所示:

@JsonIgnoreProperties(ignoreUnknown = true)
class FetchEmployeeLeavesResponse {
lateinit var leaves: List<EmployeeLeaveType>
@JsonProperty("response")
fun unpackNested(response: Map<String, Any>) {
val employeeLeaves = JSONArray()
if (response["result"] is List<*>) {
employeeLeaves.addAll(response["result"] as List<*>)
val mapper = jacksonObjectMapper()
mapper.registerModule(JavaTimeModule())
leaves = mapper.readValue(employeeLeaves.toJSONString())
}
}
}

有没有办法避免每次解析响应时都创建JavaTimeModuleObjectMapper实例?我无法在这里自动连接任何 bean,因为这个对象是 DTO,我无法访问 Spring 上下文

只需将其拉到顶层:

private val mapper = jacksonObjectMapper().also { it.registerModule(JavaTimeModule()) }
@JsonIgnoreProperties(ignoreUnknown = true)
class FetchEmployeeLeavesResponse { ... }

这样,映射器在加载类时创建一次,并且

实例的所有配置都发生在任何读取或写入调用之前

根据文档中的要求。

或者,如果您有一个固定的模块列表,如果您想在任何地方使用,甚至可以创建一个单独的文件来声明顶级val mapper并将其导入其他文件中。

最新更新