#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 для таких классов.
Я рекомендую не иметь несколько экземпляров одной и той же конфигурации.