2011-01-26 15 views
30

मुझे लगता है कि एक दिनांक वस्तु में परिवर्तित हो जाना चाहिए एक रूप क्षेत्र के साथ दिनांक वस्तु शून्य पर, इस प्रकार है:खाली स्ट्रिंग परिवर्तित स्प्रिंग

<form:input path="date" /> 

लेकिन मैं जब इस क्षेत्र को खाली है एक शून्य मान प्राप्त करना चाहते हैं, इसके बजाय मुझे प्राप्त होता है:

Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'date'; 
org.springframework.core.convert.ConversionFailedException: Unable to convert value "" from type 'java.lang.String' to type 'java.util.Date'; 

क्या यह इंगित करने का एक आसान तरीका है कि खाली स्ट्रिंग को शून्य में परिवर्तित किया जाना चाहिए? या मुझे अपना खुद का प्रॉपर्टी एडिटर लिखना चाहिए?

धन्यवाद!

+0

यदि आप एक कस्टम PropertyEditor पंजीकृत नहीं करते हैं तो यह गैर-खाली तारों के लिए कैसे काम कर सकता है? – axtavt

+0

क्योंकि वसंत में PropertyEditors में कई प्रकार के निर्माण किए गए हैं, जैसे: http://static.springsource.org/spring/docs/3.0.3.RELEASE/spring-framework-reference/html/validation.html#beans-beans- रूपांतरण –

+0

यह भी कहता है कि कस्टमडेट एडिटर डिफ़ॉल्ट रूप से पंजीकृत नहीं है, लेकिन ऐसा लगता है कि वास्तव में यह है! –

उत्तर

48

वसंत CustomDateEditor नामक एक प्रॉपर्टी एडिटर प्रदान करता है जिसे आप खाली स्ट्रिंग को शून्य मान में परिवर्तित करने के लिए कॉन्फ़िगर कर सकते हैं। आप आमतौर पर अपने नियंत्रक के @InitBinder विधि में यह रजिस्टर करने के लिए है: इन कार्यों की देखभाल करने, किसी भी तरह की संपत्ति संपादकों प्रणाली पीछे छोड़ स्प्रिंग ढांचे की शुरुआत की रूपांतरण और प्रारूपण सेवाओं की

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    dateFormat.setLenient(false); 

    // true passed to CustomDateEditor constructor means convert empty String to null 
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); 
} 
5

अधिक हाल के संस्करण। हालांकि, दुर्भाग्य से जारी की गई समस्या दुर्भाग्य से मौजूद है: डिफ़ॉल्ट DateFormatteris unable to properly convertnullDate ऑब्जेक्ट पर एक खाली स्ट्रिंग। जो मुझे बेहद परेशान लगता है वह यह है कि स्प्रिंग प्रलेखन contains a date formatter snippet example where the proper guard clauses are implemented दोनों रूपांतरणों (स्ट्रिंग्स से और) के लिए। ढांचे के कार्यान्वयन और ढांचे के दस्तावेज़ीकरण के बीच यह विसंगति वास्तव में मुझे पागल कर देती है, जितनी जल्दी मैं कार्य को समर्पित करने के लिए कुछ समय पाता हूं, उतना ही मैं पैच जमा करने का प्रयास कर सकता हूं।

इस बीच में, हर किसी के लिए मेरे सुझाव इस समस्या का सामना स्प्रिंग ढांचे का आधुनिक संस्करण का उपयोग करते समय (भी अगर यह आवश्यक है इसके print विधि,) डिफ़ॉल्ट DateFormatter उपवर्ग और उसके parse विधि ओवरराइड करने के लिए इतनी के रूप में जोड़ने के लिए है दस्तावेज में दिखाए गए एक के फैशन में एक गार्ड खंड।

package com.example.util; 

import java.text.ParseException; 
import java.util.Date; 
import java.util.Locale; 

public class DateFormatter extends org.springframework.format.datetime.DateFormatter { 

    @Override 
    public Date parse(String text, Locale locale) throws ParseException { 
     if (text != null && text.isEmpty()) { 
      return null; 
     } 
     return super.parse(text, locale); 
    } 

} 

फिर, कुछ संशोधनों के एक्सएमएल स्प्रिंग विन्यास के लिए लागू किया जाना चाहिए: एक रूपांतरण सेवा सेम परिभाषित किया जाना चाहिए, और mvc नाम स्थान में annotation-driven तत्व में इसी विशेषता को ठीक से सेट किया जाना चाहिए।

<mvc:annotation-driven conversion-service="conversionService" /> 
<beans:bean 
    id="conversionService" 
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
    <beans:property name="formatters"> 
     <beans:set> 
      <beans:bean class="com.example.util.DateFormatter" /> 
     </beans:set> 
    </beans:property> 
</beans:bean> 

एक विशिष्ट तिथि प्रारूप देने के लिए DateFormatter सेम के pattern संपत्ति ठीक से सेट किया जाना चाहिए।

<beans:bean class="com.example.util.DateFormatter"> 
    <beans:property name="pattern" value="yyyy-MM-dd" /> 
</beans:bean> 
+0

बहुत उपयोगी धन्यवाद। अगर मैं एक्सएमएल की बजाय जावा स्टाइल स्प्रिंग कॉन्फ़िगरेशन का उपयोग कर रहा था, तो क्या आप जानते हैं कि इसे कैसे पूरा किया जाए? दुर्भाग्य से, – Luke

+0

@ ल्यूक, मैं नहीं करता हूं। मैंने अभी तक स्प्रिंग प्रोजेक्ट में जावा-आधारित कॉन्फ़िगरेशन का उपयोग नहीं किया है। –

+0

ठीक है धन्यवाद, स्प्रिंग एमवीसी और स्प्रिंग वेबफ्लो कॉन्फ़िगरेशन के लिए नेट के आसपास की अधिकांश चीजें एक्सएमएल शैली (यहां तक ​​कि दस्तावेज़) है :) – Luke

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