2012-01-27 15 views
29

मैं एनोटेट स्प्रिंग 3.1 MVC कोड (वसंत-MVC) का उपयोग कर रहा है और जब मैं @RequestBody के माध्यम से तारीख वस्तु भेज तारीख संख्यात्मक रूप में दिखाया जा रहा है। यह मेरा नियंत्रकस्प्रिंग 3.1 JSON दिनांक स्वरूप

@Controller 
@RequestMapping("/test") 
public class MyController { 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(Date.class, 
        new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); 
    } 


    @RequestMapping(value = "/getdate", method = RequestMethod.GET) 
    public @ResponseBody Date getDate(@RequestParam("dt") Date dt, Model model) { 
     // dt is properly constructed here.. 
     return new Date(); 
    } 
} 

जब मैं तारीख में पास है, मैं प्रारूप में दिनांक प्राप्त करने में सक्षम हूँ। लेकिन मेरे ब्राउज़र को प्रदर्शित करता है के रूप में संख्यात्मक

1327682374011 

कैसे मैं इसे प्रारूप मैं webbinder के लिए पंजीकृत किया है में तारीख को प्रदर्शित कर सकता हूँ की तारीख? मैं कुछ मंच है कि मैं जैक्सन नक्शाकार का उपयोग करना चाहिए में देखा था, लेकिन मैं मौजूदा नक्शाकार बदल नहीं कर सकते?

उत्तर

45

आदेश निम्नलिखित Jakson के डिफ़ॉल्ट दिनांक प्रारूपण कार्यनीति को ओवरराइड करने के लिए पालन करने के लिए कदम हैं:

  1. बढ़ाएँ JsonSerializer तिथि स्वरूपण से निपटने
  2. अवहेलना serialize(Date date, JsonGenerator gen, SerializerProvider provider) में प्रारूप तारीख करने के लिए समारोह के लिए एक नया वर्ग बनाने के लिए अपने वांछित प्रारूप और इसे वापस लिखने उदाहरण (जनरल) जेनरेटर के लिए
  3. का उपयोग कर अपने विस्तारित json serializer उपयोग करने के लिए अपनी तिथि गेटर वस्तु पर टिप्पणी करें @JsonSerialize(using = CustomDateSerializer.class)

कोड:

//CustomDateSerializer class 
public class CustomDateSerializer extends JsonSerializer<Date> {  
    @Override 
    public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2) throws 
     IOException, JsonProcessingException {  

     SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
     String formattedDate = formatter.format(value); 

     gen.writeString(formattedDate); 

    } 
} 


//date getter method 
@JsonSerialize(using = CustomDateSerializer.class) 
public Date getDate() { 
    return date; 
} 

स्रोत: http://blog.seyfi.net/2010/03/how-to-control-date-formatting-when.html

+0

धन्यवाद वकास:

<!-- you can't call it objectMapper for some reason --> <bean name="jacksonObjectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="featuresToDisable"> <array> <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS"/> </array> </property> </bean> <!-- setup spring MVC --> <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper" ref="jacksonObjectMapper"/> </bean> </mvc:message-converters> </mvc:annotation-driven> 

यहाँ आपको अतिरिक्त दस्तावेज़ है। मैं सोच रहा था कि कैसे डिफ़ॉल्ट वसंत में JSON Serializer काम करता है के रूप में मैं न classpath में जैक्सन जार की है। शायद यह जैक्सन का उपयोग नहीं करता है। – moh

+3

@moh क्यों कोई स्वीकार्य उत्तर नहीं है? –

+0

@ M.AtifRiaz उपयोगकर्ता अक्टू 22 '12 18:27 पर के बाद से सक्रिय नहीं है। :) – Yubaraj

16

वैकल्पिक रूप से, अगर आप जैक्सन का उपयोग कर रहे हैं और सभी तारीखों को एक आईएसओ 8601 की तारीख चाहते हैं (न सिर्फ़ अपने आप व्याख्या), आप लेखन के डिफ़ॉल्ट निष्क्रिय कर सकते हैं टाइमस्टैम्प के रूप में तारीखें।

<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/> 
<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig" factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" /> 
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="jacksonSerializationConfig" /> 
    <property name="targetMethod" value="disable" /> 
    <property name="arguments"> 
     <list> 
      <value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_DATES_AS_TIMESTAMPS</value> 
     </list> 
    </property> 
</bean> 

तब यदि आप डिफ़ॉल्ट की तुलना में कुछ अन्य प्रारूप में अपनी तिथियाँ परिवर्तित करना चाहते हैं, तो आप ऐसा कर सकते हैं:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="jacksonSerializationConfig" /> 
    <property name="targetMethod" value="setDateFormat" /> 
    <property name="arguments"> 
     <list> 
      <bean class="java.text.SimpleDateFormat"> 
      <constructor-arg value="yyyy-MM-dd'T'HH:mm:ssZ"/> 
      </bean> 
     </list> 
    </property> 
</bean> 
5

यहाँ, ISO8601 दिनांक का उपयोग कर, यह कॉन्फ़िगर करने के लिए एक और अधिक मानक तरीका है जो मैं आपके एपीआई के लिए सिफारिश करता हूं।

संबंधित मुद्दे