Есть ли модуль данных 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();