Формат 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 ответов:
я, наконец, нашел здесь как это сделать. Чтобы исправить это, мне нужна была другая зависимость:
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; }