我正在开发一个应用程序,它调用外部系统的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())
}
}
}
有没有办法避免每次解析响应时都创建JavaTimeModule
和ObjectMapper
实例?我无法在这里自动连接任何 bean,因为这个对象是 DTO,我无法访问 Spring 上下文
只需将其拉到顶层:
private val mapper = jacksonObjectMapper().also { it.registerModule(JavaTimeModule()) }
@JsonIgnoreProperties(ignoreUnknown = true)
class FetchEmployeeLeavesResponse { ... }
这样,映射器在加载类时创建一次,并且
实例的所有配置都发生在任何读取或写入调用之前
根据文档中的要求。
或者,如果您有一个固定的模块列表,如果您想在任何地方使用,甚至可以创建一个单独的文件来声明顶级val mapper
并将其导入其他文件中。