Должен ли я объявлять ObjectMapper Джексона каждый раз, когда мне это нужно?

#java #jackson

#java #джексон

Вопрос:

У меня есть многопоточное Java-приложение, где я использую библиотеку Jackson. Каждый раз, когда мне нужен ObjectMapper, я объявляю его в классах, где мне нужно его использовать. Иногда я настраиваю этот ObjectMapper с помощью ObjectMapper.configure(), но не всегда. Это плохая практика? Есть ли какой-либо способ объявить это только один или два раза?

Комментарии:

1. Безопасность потоков рассматривается в документации . Предлагаются два основных варианта, если вам нужно использовать разные конфигурации.

Ответ №1:

Я обнаружил, что создание экземпляра new ObjectMapper () занимает довольно много времени, поэтому вам определенно следует повторно использовать объект, а не создавать его каждый раз перед повторным использованием.

Обычно я объявляю его как logger в классе, который его использует (но, конечно, это зависит от ваших конкретных требований, имеет ли это смысл для вас):

   private static final ObjectMapper objectMapper = new ObjectMapper();
  

Ответ №2:

Jackson ObjectMapper имеет множество различных параметров конфигурации для разных обстоятельств, и, хотя для выполнения операций можно совместно использовать экземпляр в разных потоках, совершенно обычно требуются существенно разные настройки (например, когда вы используете REST API, который использует camel_case именование, или даже используете сопоставитель YAML или CSV).

По этой причине я не рекомендую создавать ObjectMapper компонент не больше, чем я рекомендую создавать Function<Foo, Bar> или String beans; тип bean недостаточно специфичен.

Вместо этого, ObjectMapper гораздо больше похоже на часть API, потому что такие настройки, как «использовать camel_case » или «записывать даты в виде строк ISO 8601», не похожи на время истечения срока действия кэша, они отражают фиксированную часть контракта.

Я рекомендую создать фабричные методы, которые будут создавать новые экземпляры на основе требований, специфичных для вариантов использования. Эти методы могут находиться в библиотеках, общих для всей вашей компании, чтобы обеспечить согласованное сопоставление именования переменных, обработки даты / времени и т.д.:

 public static ObjectMapper companyObjectMapper() {
    // company-wide standard configuration
    ...
}

public static ObjectMapper specificRestApiObjectMapper() {
    // uses Unix epoch for dates and camel_case
    ...
  

Ответ №3:

Старайтесь повторно использовать objectmapper везде, где это возможно. Потому что это потокобезопасно. Если для каких-либо классов требуются разные конфигурации в objectmapper, только тогда создавайте экземпляр отдельного objectmapper для таких классов.

Я рекомендую не иметь несколько экземпляров одной и той же конфигурации.