Формат JSON Java 8 LocalDateTime в весенней загрузке


у меня небольшая проблема с форматированием Java 8 LocalDateTime в моем приложении Spring Boot. С "нормальными" датами у меня нет проблем, но поля LocalDateTime преобразуются в следующие:

"startDate" : {
    "year" : 2010,
    "month" : "JANUARY",
    "dayOfMonth" : 1,
    "dayOfWeek" : "FRIDAY",
    "dayOfYear" : 1,
    "monthValue" : 1,
    "hour" : 2,
    "minute" : 2,
    "second" : 0,
    "nano" : 0,
    "chronology" : {
      "id" : "ISO",
      "calendarType" : "iso8601"
    }
  }

в то время как я хотел бы преобразовать его в что-то вроде:

"startDate": "2015-01-01"

мой код выглядит так:

@JsonFormat(pattern="yyyy-MM-dd")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
public LocalDateTime getStartDate() {
    return startDate;
}

но ни одна из вышеуказанных аннотаций не работает, дата продолжает форматироваться, как указано выше. Предложения приветствуются!

8 76

8 ответов:

я, наконец, нашел здесь как это сделать. Чтобы исправить это, мне нужна была другая зависимость:

compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.4.0")

включив эту зависимость, Spring автоматически зарегистрирует конвертер для нее, как описано здесь. После этого вам нужно добавить в приложение следующее.свойства:

spring.jackson.serialization.write_dates_as_timestamps=false

Это позволит убедиться, что используется правильный конвертер, и даты будут напечатаны в формате 2016-03-16T13:56:39.492

аннотации нужны только в если вы хотите изменить формат даты.

добавил com.быстрее!Джексон.тип данных: jackson-datatype-jsr310: 2.6.1 зависимость и я начал получать дату в следующем формате:

"birthDate": [
    2016,
    1,
    25,
    21,
    34,
    55
  ]

это не то, что я хотел, но я приближался. Затем я добавил следующее

spring.jackson.serialization.write_dates_as_timestamps=false

для приложения.файл свойств, который дал мне правильный формат, который мне нужен.

"birthDate": "2016-01-25T21:34:55"

вот он в maven, со свойством, так что вы можете выжить между весенними обновлениями загрузки

<dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>${jackson.version}</version>
</dependency>

1) Зависимость

 compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.8.8' 

2) аннотация с форматом даты-времени.

public class RestObject {

    private LocalDateTime timestamp;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public LocalDateTime getTimestamp() {
        return timestamp;
    }
}

3) Весенний Конфиг.

@Configuration
public class JacksonConfig {

    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        System.out.println("Config is starting.");
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return objectMapper;
    }
}

Я нашел другое решение, которое вы можете преобразовать его в любой формат, который вы хотите, и применить ко всем типам данных LocalDateTime, и вам не нужно указывать @JsonFormat над каждым типом данных LocalDateTime. сначала добавьте зависимость:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

добавить следующий Боб:

@Configuration
public class Java8DateTimeConfiguration {
    /**
     * Customizing
     * http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html
     *
     * Defining a @Bean of type Jackson2ObjectMapperBuilder will allow you to customize both default ObjectMapper and XmlMapper (used in MappingJackson2HttpMessageConverter and MappingJackson2XmlHttpMessageConverter respectively).
     */
    @Bean
    public Module jsonMapperJava8DateTimeModule() {
        val bean = new SimpleModule();

        bean.addDeserializer (ZonedDateTime.class, new JsonDeserializer<ZonedDateTime>() {
            @Override
            public ZonedDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
                return ZonedDateTime.parse(jsonParser.getValueAsString(), DateTimeFormatter.ISO_ZONED_DATE_TIME);
            }
        });

        bean.addDeserializer(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
            @Override
            public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
                return LocalDateTime.parse(jsonParser.getValueAsString(), DateTimeFormatter.ISO_LOCAL_DATE_TIME);
            }
        });

        bean.addSerializer(ZonedDateTime.class, new JsonSerializer<ZonedDateTime>() {
            @Override
            public void serialize(
                    ZonedDateTime zonedDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                    throws IOException {
                jsonGenerator.writeString(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zonedDateTime));
            }
        });

        bean.addSerializer(LocalDateTime.class, new JsonSerializer<LocalDateTime>() {
            @Override
            public void serialize(
                    LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
                    throws IOException {
                jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime));
            }
        });

        return bean;
    }
}

в файле config добавить следующее :

@Import(Java8DateTimeConfiguration.class)

это будет сериализовать и де-сериализовать все свойства LocalDateTime и ZonedDateTime, пока вы используете objectMapper создан весной.

формат, который вы получили для ZonedDateTime: "2017-12-27T08:55:17.317+02: 00[Азия / Иерусалим]" для LocalDateTime это: "2017-12-27T09: 05: 30.523"

Это отлично работает:

добавить зависимость:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>

добавить аннотацию:

@JsonFormat(pattern="yyyy-MM-dd")

Теперь, вы должны получить правильный формат.

чтобы использовать object mapper, вам нужно зарегистрировать JavaTime

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

@JsonDeserialize(using= LocalDateDeserializer.class) не работает для меня ниже зависимостей.

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version> 2.9.6</version>
</dependency>

я использовал ниже конвертер кода для десериализации даты в java.sql.Date.

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;


@SuppressWarnings("UnusedDeclaration")
@Converter(autoApply = true)
public class LocalDateConverter implements AttributeConverter<java.time.LocalDate, java.sql.Date> {


    @Override
    public java.sql.Date convertToDatabaseColumn(java.time.LocalDate attribute) {

        return attribute == null ? null : java.sql.Date.valueOf(attribute);
    }

    @Override
    public java.time.LocalDate convertToEntityAttribute(java.sql.Date dbData) {

        return dbData == null ? null : dbData.toLocalDate();
    }
}

написание этого ответа в качестве напоминания для меня, а также.

Я объединил несколько ответов здесь, и в конце концов мой работал с чем-то вроде этого. (Я использую SpringBoot 1.5.7 и Lombok 1.16.16)

@Data
public Class someClass {

   @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
   @JsonSerialize(using = LocalDateTimeSerializer.class)
   @JsonDeserialize(using = LocalDateTimeDeserializer.class)
   private LocalDateTime someDate;

}