2015-02-26 9 views
9

का उपयोग कर मैं एक जावा 8 वसंत MVC अनुप्रयोग है कि एक बाकी सेवा (मैं इस के लिए वसंत के RestTemplate उपयोग कर रहा हूँ) का उपयोग कर एक विरासत प्रगति OpenEdge आवेदन के साथ संचार लिख रहा हूँ। डेटा को प्रगति अनुप्रयोग से पढ़ने और लिखने की आवश्यकता है जिसमें कुछ तिथियां हैं। जावा आवेदन में, मैं एक java.time.LocalDate डेटाप्रकार का उपयोग इन क्षेत्रों का प्रतिनिधित्व करने और मैं क्रमानुसार/Json से/में डेटा deserialize करने के लिए जैक्सन उपयोग कर रहा हूँ।को क्रमानुसार java.time.localdate जैक्सन

समस्या मैं आ रही

निम्नलिखित है। जब मैं प्रगति अनुप्रयोग से डेटा भेजता हूं, तो तिथि '2015-01-02' के रूप में भेजी जाती है और मेरी जावा इकाई में एक स्थानीयडेट के रूप में संग्रहीत की जाती है। जब डेटा वेब फ्रंट-एंड पर भेजा जाता है तो जेसन में उसी प्रारूप में दिनांक भी शामिल होता है। जब मैं वेब फ्रंट-एंड में जानकारी बदलता हूं और इसे लागू करता हूं, तो यह जावा एप्लिकेशन को '2015-01-02' के रूप में भी वापस भेजता है और फिर बिना किसी समस्या के स्थानीय लोकेट के रूप में संग्रहीत किया जाता है। लेकिन जब मैं से प्रगति करने के लिए आवेदन के बाद डेटा भेजने, Json मैं प्राप्त करते हैं '2015-01-02' लेकिन एक सरणी तीन क्षेत्रों (2015.0, 1.0, 2.0) और प्रगति अनुप्रयोग है युक्त के रूप में की तारीख शामिल नहीं है डेटाबेस में किसी दिनांक फ़ील्ड को वापस असाइन करने में असमर्थ।

ऑफकोर्स मैं सरणी को वापस एक तारीख में बदलने के लिए प्रगति पक्ष पर एक रूपांतरण लिख सकता हूं, लेकिन मैं इसे टालना चाहता हूं क्योंकि मैं हमेशा आईएसओ 8601 प्रारूप में भेजने की तारीख की अपेक्षा करता हूं।

जैक्सन पर मिली जानकारी के अनुसार, java.time.LocalDate को एक सरणी के रूप में दर्शाया जाता है जब WRITE_DATES_AS_TIMESTAMPS सक्षम होता है, लेकिन मैंने यह अक्षम कर दिया है (और जब दिनांक वेब फ्रंट-एंड पर भेजता है, तो यह नहीं है

CustomObjectMapper: एक सरणी ...)

यहाँ के रूप में भेजने की जा रही कुछ प्रासंगिक कोड है मेरी servlet.xml में

@Service 
public class CustomObjectMapper extends ObjectMapper 
{ 
    public CustomObjectMapper() 
    { 
    this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, 
        false); 
    } 
} 

विन्यास

<mvc:annotation-driven> 
    <mvc:message-converters> 
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
     <property name="objectMapper" ref="customObjectMapper"/> 
    </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

<bean id="customObjectMapper" class="com.msoft.utility.CustomObjectMapper"/> 

क्षेत्र परिभाषा:

@JsonDeserialize(using = LocalDateDeserializer.class) 
@JsonSerialize(using = LocalDateSerializer.class) 
private LocalDate deliveryDate; 

मैं जावा 8 का उपयोग कर रहा स्प्रिंग 4.1.5 और 2.5.1 जैक्सन के साथ।

कोई युक्ति कैसे मैं इस काम के लिए या एक समाधान के लिए खोज करने के लिए बहुत सराहना की जाएगी के रूप में मैं पहले से ही लगभग 2 दिनों के लिए इस पर काम कर रहा हूँ थे सकता है ...

धन्यवाद

संपादित करें :

कुछ अतिरिक्त जानकारी ...

मैं अपने pom.xml में जैक्सन JSR-310 मॉड्यूल शामिल किया है। यहाँ मेरी पोम फ़ाइल के releveant हिस्सा

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.5.1</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-annotations</artifactId> 
    <version>2.5.1</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.5.1</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-jsr310</artifactId> 
    <version>2.5.1</version> 
</dependency> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-test</artifactId> 
    <version>4.1.5.RELEASE</version> 
    <scope>test</scope> 
    <type>jar</type> 
</dependency> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-webmvc</artifactId> 
    <version>4.1.5.RELEASE</version> 
</dependency> 
<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-jpa</artifactId> 
    <version>1.7.2.RELEASE</version> 
</dependency> 

इसके अलावा, अगर मैं सही ढंग से समझ में आया, वसंत स्वचालित रूप से जब यह पता चला है इस मॉड्यूल में दर्ज किए जाएंगे है ...,। पर Jackson2ObjectMapperFactoryBean

नोट की जानकारी है कि जैक्सन के JSR-310 और Joda समय समर्थन मॉड्यूल जा स्वचालित रूप से पंजीकृत होगा देखें जब उपलब्ध है (और जब जावा 8 और Joda समय खुद को उपलब्ध क्रमशः)।

तो मुझे नहीं लगता कि मैं कुछ और करने की यह सही ढंग से काम पाने के लिए होना चाहिए, लेकिन स्पष्ट रूप से मैं अभी भी कुछ याद कर रहा हूँ ...

+0

के लिए क्या इसके लायक है, तो आप, व्याख्या का उपयोग नहीं करना चाहिए अगर मॉड्यूल ठीक से पंजीकृत है। एनोटेशन ओवरराइड का उपयोग किया जाएगा, और डिफॉल्ट हैंडलर पंजीकृत नहीं हैं। यह मामला हो सकता है या इससे कोई फर्क नहीं पड़ता, क्योंकि प्रारंभिकरण थोड़ा अलग है। – StaxMan

+0

यदि मैं डिलिवरीडेट संपत्ति पर एनोटेशन हटा देता हूं, तो तारीख को निम्न संरचना के साथ जावा से एक ऑब्जेक्ट के रूप में भेजा जाता है: {"वर्ष": 2015, "महीना": "जनवरी", "दिनऑफमोन्थ": 2, "dayOfWeek": "शुक्रवार", "युग": "CE", "dayOfYear": 2, "leapYear": झूठे, "monthValue": 1, "कालक्रम": { "id": "आईएसओ", "calendarType": "iso8601" }} 2015/01/02 के बजाय मैं चाहूंगा। मदद के लिए धन्यवाद, लेकिन अभी भी जो मैं ढूंढ रहा हूं ... – HeinoVDS

+0

एक ही समस्या ... क्या आपको एक समाधान मिला है –

उत्तर

5

मुझे लगता है कि तुम सिर्फ JSR-310 रजिस्टर करने की आवश्यकता (जावा 8 दिनांक/समय) मॉड्यूल:

https://github.com/FasterXML/jackson-datatype-jsr310/

के बाद जैक्सन कोर किसी भी जावा 8 सुविधाओं पर भरोसा नहीं कर सकते (2.5 के साथ इस बिंदु पर आधारभूत, जावा 6 है)। और अधिकांश डेटाटाइप पुस्तकालयों के लिए आगे बढ़ने का समर्थन प्लग-इन मॉड्यूल के माध्यम से होगा।

+0

बकवास, मैं इसका उल्लेख करना भूल गया ... लेकिन मेरे पास उस मॉड्यूल को मेरे pom.xml में शामिल किया गया है। मैं कुछ अतिरिक्त जानकारी के साथ अपना प्रश्न अपडेट करूँगा ... – HeinoVDS

8

यह मेरे लिए काम करता है, और मैं स्प्रिंग बूट का उपयोग नहीं कर रहा हूं।

@Configuration 
@EnableWebMvc 
public class SpringMvcConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
     builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
     converters.add(new MappingJackson2HttpMessageConverter(builder.build())); 
    } 
} 
+0

कॉन्फ़िगरेशन मैसेज कन्वर्टर्स भाग जोड़ा गया है, क्योंकि यह इसके बिना काम नहीं करेगा: पी – Niclas

+0

'SerializationFeature.WRITE_DATES_AS_TIMESTAMPS' को' SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS' 'को अक्षम करना सुनिश्चित करें। वे समान दिखते हैं, लेकिन केवल पहले काम करते थे। 2 घंटों के लिए इसे डिबग कर रहा था। – Jaanus

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