Есть ли модуль данных Jackson для JDK8 java.time?
Я ищу модуль для новых классов JDK8 java.time. Я просмотрел FasterXML GitHub Project Listing и в настоящее время не нашел его.
Как я понимаю, Джексон все еще компилируется против JDK6, поэтому не может напрямую использовать эти классы и должен иметь это встроенное в отдельный модуль, как это требовалось с Joda.
Я не против запуска проекта, хотя хочу посмотреть, не начались ли какие-либо другие усилия.
Ответы
Ответ 1
Самый полный список модулей типа данных можно найти на странице портала "Джексон" в Github:
https://github.com/FasterXML/jackson
который перечисляет "JSR-310: поддержка" Java 8 Dates ".
Именование немного непрозрачно, но оно относится к процессу стандартизации через JSR, который должен быть доработан для создания нового API дат Java8 (если он еще не окончательный, процесс занял некоторое время).
Прямая ссылка: https://github.com/FasterXML/jackson-datatype-jsr310
Ответ 2
Как уже упоминалось, Jackson-Datatype-JSR310 поддерживает Java 8 Time.
Поскольку Jackson 2.6.0 "старый" JSR310Module устарел. Он заменяется JavaTimeModule. Зависимость от Maven одинакова (вы можете найти текущую версию в Maven Central):
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.6.0</version>
</dependency>
Вы должны зарегистрировать модуль следующим образом:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
Обратите внимание: начиная с версии 2.6, этот модуль НЕ поддерживает автоматическую регистрацию из-за существования устаревшей версии JSR310Module. Унаследованная версия имеет одинаковую функциональность, но немного другую конфигурацию по умолчанию: см. Com.fasterxml.jackson.datatype.jsr310. JSR310Module для деталей.
Источник JavaTimeModule в GitHub
Использование JavaTimeModule
Ответ 3
Вам просто нужно импортировать модуль jsr310.
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.5.0</version>
</dependency>
Если автоматическое сканирование модуля не включено в вашем проекте, вам необходимо зарегистрировать его:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JSR310Module());
Ответ 4
Мой плохой, я искал jackson-datatype-jdk8
, как это было для jackson-datatype-jdk7, однако проект был фактически создан под именем JSR jackson-datatype-jsr310.
Ответ 5
Если вы используете Spring Boot 2 и зависит от spring-boot-starter-web
стартера spring-boot-starter-web
стартера, у вас будут как зависимости, так и устаревшие (jackson-datatype-jsr310) и фактические (jackson-datatype-jdk8).
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.0.0.M3:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-json:jar:2.0.0.M3:compile
[INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.9.0.pr4:compile
[INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.9.0.pr4:compile
Ответ 6
Как уже упоминалось, Spring-Boot будет загружать все, что вам нужно для использования (как для веб, так и для начала webflux). Но что еще лучше - вам не нужно регистрировать какие-либо модули самостоятельно. Посмотрите здесь. Поскольку @SpringBootApplication
использует @EnableAutoConfiguration
под капотом, это означает, что JacksonAutoConfiguration
будет автоматически добавлен в контекст. Теперь, если вы загляните внутрь JacksonAutoConfiguration
, вы увидите:
private void configureModules(Jackson2ObjectMapperBuilder builder) {
Collection<Module> moduleBeans = getBeans(this.applicationContext,
Module.class);
builder.modulesToInstall(moduleBeans.toArray(new Module[0]));
}
Этот парень будет вызываться в процессе инициализации и будет извлекать все модули, которые он может найти в пути.
Ответ 7
Вы должны быть в состоянии использовать
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();