2015-04-29 1 views
60

У меня возникла небольшая проблема с форматированием Java 8 LocalDateTime в моем приложении загрузки Spring. С «нормальными» датами у меня нет никаких проблем, но поля LocalDateTime преобразуются в следующие:JSON Java 8 Формат 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; 
} 

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

ответ

84

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

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

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

spring.jackson.serialization.write_dates_as_timestamps=false 

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

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

+10

Возможно, стоит включить следующую аннотацию - '@JsonSerialize (using = LocalDateTimeSerializer.class)' ... –

+1

Вероятно, лучше просто использовать запись 'application.properties', как предложено @patelb answer. – membersound

+0

Не работает. Но ответ Пателиба просто работает из коробки! –

64

Я добавил com.fasterxml.jackson.datatype: ДЖЕКСОН-тип_данный-jsr310: 2.6.1 зависимости и я начал получать дату в следующем формате:

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

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

spring.jackson.serialization.write_dates_as_timestamps=false 

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

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

Работала из коробки при включении зависимости 'jackson-datatype-jsr310'. Это должен быть принятый ответ. – membersound

+3

В качестве FYI, то application.properties часть может быть сделано с помощью Java конфигурации, если вы настройки ObjectMapper с: 'mapper.configure (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, ложь);' – justin

20

Здесь в мавена, со свойством, так что вы можете выжить между пружинными модернизаций загрузки

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

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) Spring Config.

@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; 
    } 
} 
1

Я нашел другое решение, которое распространяется на всех 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; 
    } 
} 

в вашем конфигурационном файле добавить следующее:

@Import(Java8DateTimeConfiguration.class) 

Это сериализации и десериализации все свойства LocalDateTime и ZonedDateTime, если вы используете objectMapper, созданный весной.

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

+0

Probabaly вам нужно заменить \t VAL фасоль в SimpleModule bean = new SimpleModule(); – Abhi