Как избежать создания нового экземпляра ObjectMapper, каждый тип ответа от внешней системы получен и проанализирован с Джексоном? - PullRequest
0 голосов
/ 14 октября 2019

Я разрабатываю приложение, которое вызывает REST API внешней системы и отображает ответ, используя Джексона. 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 каждый раз, когда я анализирую ответ? Я не могу автоматически подключить какой-либо компонент здесь, так как этот объект является DTO, и у меня нет доступа к контексту Spring

1 Ответ

3 голосов
/ 14 октября 2019

Просто вытащите его на верхний уровень:

private val mapper = jacksonObjectMapper().also { it.registerModule(JavaTimeModule()) }

@JsonIgnoreProperties(ignoreUnknown = true)
class FetchEmployeeLeavesResponse { ... }

Таким образом, маппер создается один раз при загрузке класса и

ВСЕ настройки конфигурацииЭто происходит до того, как ЛЮБЫЕ вызовы чтения или записи

, как требуется в документации.

Или даже сделать отдельный файл с объявлением верхнего уровня val mapper и импортировать его в другоефайлы, если у вас есть фиксированный список модулей, которые вы хотите использовать везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...