2012-05-18 10 views
13

साथ मैं JodaTime से निपटने के लिए Serializer नीचे है:स्प्रिंग @ResponseBody जैक्सन JsonSerializer JodaTime

@JsonSerialize(using=JodaDateTimeJsonSerializer.class) 
public DateTime getEffectiveDate() { 
    return effectiveDate; 
} 
ऊपर सेटिंग के साथ

, @ResponseBody और जैक्सन:

public class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> { 

    private static final String dateFormat = ("MM/dd/yyyy"); 

    @Override 
    public void serialize(DateTime date, JsonGenerator gen, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 

     String formattedDate = DateTimeFormat.forPattern(dateFormat).print(date); 

     gen.writeString(formattedDate); 
    } 

} 

फिर, प्रत्येक मॉडल वस्तुओं पर, मैं यह कर मैपर यकीन है कि काम करता है। हालांकि, मुझे यह विचार पसंद नहीं है जहां मैं @JsonSerialize लिख रहा हूं। मुझे मॉडल ऑब्जेक्ट्स पर @JsonSerialize के बिना समाधान की आवश्यकता है। क्या एक कॉन्फ़िगरेशन के रूप में वसंत xml में कहीं भी इस कॉन्फ़िगरेशन को लिखना संभव है?

आपकी सहायता की सराहना करें।

उत्तर

10

यद्यपि आप प्रत्येक तिथि क्षेत्र के लिए एक एनोटेशन डाल सकते हैं, अपने वस्तु नक्शाकार के लिए एक वैश्विक विन्यास करना बेहतर है। आप जैक्सन का उपयोग करते हैं आप इस प्रकार अपने वसंत कॉन्फ़िगर कर सकते हैं:

<bean id="jacksonObjectMapper" class="com.company.CustomObjectMapper" /> 

<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig" 
    factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" > 
</bean> 

CustomObjectMapper के लिए:

public class CustomObjectMapper extends ObjectMapper { 

    public CustomObjectMapper() { 
     super(); 
     configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false); 
     setDateFormat(new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'ZZZ (z)")); 
    } 
} 
बेशक

, SimpleDateFormat किसी भी प्रारूप आप की जरूरत का उपयोग कर सकते हैं।

+0

'setDateFormat (नई SimpleDateFormat (" yyyy-MM-dd'T'HH: mm: ssz "));' मेरे लिए चाल किया था, THX – Konsumierer

-3

आप बस अपने classpath पर जैक्सन जार है, और एक @ResponseBody वापस लौटाते हैं, वसंत स्वचालित रूप से मॉडल वस्तु JSON में बदल जाएगा। इसे काम करने के लिए आपको मॉडल में कुछ भी टिप्पणी करने की आवश्यकता नहीं है।

+0

खैर मैंने कोशिश की। जब जैक्सन ने ऑब्जेक्ट को JSON में परिवर्तित कर दिया, तो उसने जोडाटाइम इंस्टेंस को इसमें मिलीसेकंड के साथ एक स्ट्रिंग में परिवर्तित कर दिया। यही कारण है कि एक कस्टम कनवर्टर। मैं वास्तव में अपने सभी दिनांक चर में @JsonSerialize का उपयोग करने से बचना चाहता हूं। मुझे आवेदन स्तर में इसे कॉन्फ़िगर करने का एक तरीका चाहिए। –

+0

ऐसा लगता है कि मैं अपनी धारणा में गलत था। वहाँ वास्तव में एक संबंधित स्प्रिंग बग (https://jira.springsource.org/browse/SPR-6731) ने अपने पाने के लिए काम करने के लिए डिफ़ॉल्ट एनोटेशन है, लेकिन फिर भी वहाँ,। तो, ऐसा प्रतीत होता है कि आपको प्रत्येक मॉडल वर्ग में एनोटेट करने की आवश्यकता है। – atrain

+0

मैं समझता हूं। सुनिश्चित नहीं है कि किसी ने एओपी शैली में इसे सफलतापूर्वक कॉन्फ़िगर किया है। आइए प्रतीक्षा करें कि किसी और के पास कोई टिप्पणी है या नहीं। –

1

@Moesio काफी समझ में आ गया।

<!-- Configures the @Controller programming model --> 
<mvc:annotation-driven/> 

<!-- Instantiation of the Default serializer in order to configure it --> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterConfigurer" init-method="init"> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
       <property name="objectMapper" ref="jacksonObjectMapper" /> 
      </bean> 
     </list> 
    </property> 
</bean> 

<bean id="jacksonObjectMapper" class="My Custom ObjectMapper"/> 

<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig" 
    factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" /> 

सा है कि मिल गया मुझे उस <mvc:annotation-driven/> अपनी ही AnnotationMethodHandler बनाता है और एक आप मैन्युअल रूप से बनाने पर ध्यान नहीं देता है: यहाँ मेरी config है। मुझे इस्तेमाल होने वाले एक को कॉन्फ़िगर करने के लिए http://scottfrederick.blogspot.com/2011/03/customizing-spring-3-mvcannotation.html से बीनपोस्टप्रोसेसिंग विचार मिला, और voilà! एक जादू की तरह काम करता है।

0

ही स्प्रिंग 3 की JavaConfig का उपयोग कर:

@Configuration 
@ComponentScan() 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter 
{ 

    @Override 
    public void configureMessageConverters(final List<HttpMessageConverter<?>> converters) 
    { 
     converters.add(0, jsonConverter()); 
    } 

    @Bean 
    public MappingJacksonHttpMessageConverter jsonConverter() 
    { 
     final MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter(); 
     converter.setObjectMapper(new CustomObjectMapper()); 

     return converter; 
    } 
} 
संबंधित मुद्दे