2015-04-29 17 views
60

में जेएसओएन जावा 8 लोकलडेटाइम प्रारूप मेरे स्प्रिंग बूट एप्लिकेशन में जावा 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") 

इस निर्भरता को शामिल करके, वसंत स्वचालित रूप से एक कनवर्टर इसके लिए, के रूप में वर्णित here रजिस्टर करेंगे। उसके बाद, आप application.properties को निम्नलिखित जोड़ने की जरूरत:

spring.jackson.serialization.write_dates_as_timestamps=false 

इससे यह सुनिश्चित होगा कि एक सही कनवर्टर प्रयोग किया जाता है, और तिथियों 2016-03-16T13:56:39.492

एनोटेशन का स्वरूप ही में की जरूरत है में प्रिंट किया जाएगा अगर आप दिनांक प्रारूप बदलना चाहते हैं। जैक्सन-डेटाप्रकार-jsr310:

+10

संभवत: निम्नलिखित एनोटेशन सहित - '@JsonSerialize (= LocalDateTimeSerializer.class का उपयोग करके)' –

+1

@patelb उत्तर द्वारा सुझाए गए अनुसार, केवल 'application.properties' प्रविष्टि का उपयोग करना बेहतर होगा। – membersound

+0

काम नहीं कर रहा है। लेकिन पटेलिब का जवाब बस बॉक्स से बाहर काम करता है! –

64

मैं com.fasterxml.jackson.datatype जोड़ा 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

'जैक्सन-डेटाटाइप-जेएसआर 310' निर्भरता सहित बॉक्स से बाहर काम किया। यह स्वीकार्य उत्तर होना चाहिए। – membersound

+3

एक FYI करें, application.properties हिस्सा अगर तुम साथ ObjectMapper कॉन्फ़िगर कर रहे हैं जावा config के माध्यम से किया जा सकता है के रूप में: (झूठे SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) 'mapper.configure;' – 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) तिथि समय प्रारूप के साथ एनोटेशन के बीच जीवित रह सकते हैं Maven में है, संपत्ति के साथ।

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

मैं एक और समाधान जो सभी LocalDateTime डेटाप्रकार पर लागू होते हैं मिल गया है और आप हर LocalDateTime डेटाप्रकार ऊपर @JsonFormat निर्दिष्ट करने के लिए नहीं है।निम्नलिखित सेम जोड़ें

<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) 

यह क्रमानुसार होगा और डी-serialize सभी गुण LocalDateTime और ZonedDateTime जब तक आप वसंत द्वारा बनाई गई objectMapper का उपयोग कर रहे हैं।

प्रारूप है कि आप ZonedDateTime के लिए मिल गया है: "2017-12-27T08: 55: 17.317 + 02: 00 [एशिया/यरूशलेम]" LocalDateTime के लिए है: "2017-12-27T09: 05: 30.523"

+0

Probabaly आप SimpleModule को \t वैल सेम प्रतिस्थापित करने की आवश्यकता बीन = नया सरल मॉड्यूल(); – Abhi