Spring загрузка Joda DateTime Сериализация

Я пытаюсь сериализовать свойства Joda DateTime как ISO-8601 с помощью Spring Boot v1.2.0.BUILD-SNAPSHOT Вот мое очень простое приложение REST.

@RestController
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    class Info{

       private DateTime dateTime;

        public Info(){
            dateTime = new DateTime();
        }
        public DateTime getDateTime() {
           return dateTime;
        }

        public void setDateTime(DateTime dateTime) {
           this.dateTime = dateTime;
        }
    }

    @RequestMapping("/info")
    Info info() {
        return new Info();
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
   public Module getModule(){
        return new JodaModule();
   }
}

DateTime серируется как временная метка, например. { "DateTime": 1415954873412} Я пробовал добавить

    @Bean
    @Primary
    public ObjectMapper getObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
                false);
        return objectMapper;
    }

но это тоже не помогло. Итак, как мне настроить jackson в Spring Boot для сериализации с использованием формата ISO-8601? BTW: я добавил только следующие зависимости к моей конструкции gradle

compile("joda-time:joda-time:2.4")
compile("org.jadira.usertype:usertype.jodatime:2.0.1")
compile("com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.2");

Ответы

Ответ 1

Поскольку вы используете Spring Boot 1.2, вы можете просто добавить в свой файл application.properties следующее:

spring.jackson.serialization.write_dates_as_timestamps=false

Это даст результат в форме:

{
    "dateTime": "2014-11-18T19:01:38.352Z"
}

Если вам нужен настраиваемый формат, вы можете напрямую настроить JodaModule, например, чтобы отбросить временную часть:

@Bean
public JodaModule jacksonJodaModule() {
    JodaModule module = new JodaModule();
    DateTimeFormatterFactory formatterFactory = new DateTimeFormatterFactory();
    formatterFactory.setIso(ISO.DATE);
    module.addSerializer(DateTime.class, new DateTimeSerializer(
        new JacksonJodaFormat(formatterFactory.createDateTimeFormatter()
            .withZoneUTC())));
    return module;
}

Ответ 2

С помощью Spring Boot 1.2 вы можете свободно использовать builder для создания экземпляра ObjectMapper:

@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    return builder
              .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
              .build();
}

Что касается JodaModule, он будет автоконфигурирован, если com.fasterxml.jackson.datatype:jackson-datatype-joda находится в пути к классам.

Ответ 3

Передайте new JodaModule() конструктору вашего объекта mapper.

Аннотирование ваших информационных методов с помощью шаблона ISO

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")

или я думаю, вы можете использовать это, если используете spring

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateTimeFormat.ISO.DATE_TIME)

Ответ 4

Добавьте это в свой application.* в свои ресурсы. (Я использую yamel так, чтобы он .yml для меня, но должен быть .properties по умолчанию)

spring.jackson.date-format: yyyy-MM-dd'T'HH:mm:ssZ

Или любой формат, который вы хотите.

Ответ 5

Существует также свойство joda-date-time-format (я думаю, что это свойство впервые появилось в версиях Spring boot версии 1.3.x), которые вы можете установить в свой application.properties, который будет работать для сериализации jackson/десериализации:

От: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.jackson.joda-date-time-format= # Joda date time format string. If not configured, "date-format" will be used as a fallback if it is configured with a format string.

Итак, если вы хотите использовать формат ISO, вы можете установить его так:

spring.jackson.joda-date-time-format=yyyy-MM-dd'T'HH:mm:ss.SSSZ

У вас может быть разное количество "Z", которое изменяет способ отображения идентификатора часового пояса или времени смещения из документации по времени в формате joda (http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html):

Zone: 'Z' outputs offset without a colon, 'ZZ' outputs the offset with a colon, 'ZZZ' or more outputs the zone id.