2011-11-09 12 views
6

में फ़ील्ड स्वरूपों का वैश्विक पंजीकरण मैंने विकेट में बिगडिसीमल स्वरूपण को अनुकूलित करने के बारे में सावधानीपूर्वक Jonik's entry का अध्ययन किया है। कोड के इस उत्कृष्ट टुकड़े के लिए धन्यवाद। दुर्भाग्य से मैं इसे अपने उपयोग के मामले के लिए काम नहीं कर सकता।विकेट

मैं विश्व स्तर पर दिनांक प्रारूपण पंजीकृत करना चाहते हैं और आवेदन उपवर्ग में निम्नलिखित कोड का उपयोग कर रहा:

@Override 
protected IConverterLocator newConverterLocator() { 
    ConverterLocator converterLocator = new ConverterLocator(); 
    converterLocator.set(Date.class, new DateConverter() { 

     @Override 
     public DateFormat getDateFormat(Locale ignore) { 
      return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 
     } 

    }); 
    return converterLocator; 
} 

फिर जब वेब पृष्ठों कोड है में दिनांक फ़ील्ड का उपयोग कर इस प्रकार है:

form.add(new TextField<Date>("dateField")); 

प्रस्तुत किए जाने पर, दिनांक फ़ील्ड मानक java.text.DateFormat.SHORT (02.11.11 11:59) स्वरूपण को मेरे कस्टम SimpleDateFormat (02.11.2011 11:59:42) के बजाय org.apache.wicket.util.convert.converter.DateConverter कक्षा से आ रहा है।

मैंने जांच की है कि java.util.Date का उपयोग पूरे समय किया जा रहा है। विकेट संस्करण 1.4.12 है।

कोई विचार?

+0

यह नया टेक्स्टफ़िल्ल्ड ("डेटफ़िल्ल्ड", नया मॉडल (नई तिथि()) का उपयोग करके 1.4.12 क्विकस्टार्ट में ठीक काम कर रहा है। टेक्स्टफिल्ड का मॉडल क्या है? यदि प्रपत्र में कंपाउंडप्रोपर्टी मॉडेल है, तो कौन सा वर्ग संपत्ति दिनांक फ़ील्ड का हल करता है? –

+0

धन्यवाद ज़वी। यह फॉर्म एक 'कंपाउंडप्रोपर्टी मॉडेल' है जो एक दृढ़ता इकाई का जिक्र करता है जिसका 'डेटफिल्ल्ड' java.util.Date है। चूंकि हम दृढ़ता इकाइयों का उपयोग कर रहे हैं, गेटटर/सेटर श्रृंखलाओं के अंत में फ़ील्ड कच्चे जावा डेटा प्रकार हैं, न कि इमेडेल के कार्यान्वयन। क्या यह समस्या है? –

+0

क्या आप निश्चित हैं कि आपका 'नया कनवर्टर लोकेटर() 'उपयोग किया जा रहा है? क्या चल रहा है यह देखने के लिए आपने 'Component.getConverter (क्लास)' के माध्यम से डीबग किया है? आप इस विशेष घटक में ओवरराइड में आसानी से ब्रेकपॉइंट डाल सकते हैं। –

उत्तर

5

मुझे लगता है कि आपके dateField में java.util.Date है, लेकिन वास्तविक वस्तु (डेटाबेस से लोड की गई है?) उदा। java.sql.Timestamp या java.util.Date के कुछ अन्य बच्चे। यही कारण है कि ConverterLocator आपके बजाय अन्य कनवर्टर चुनता है।

set(Date.class, new DateConverter()); 
set(Calendar.class, new CalendarConverter()); 
set(java.sql.Date.class, new SqlDateConverter()); 
set(java.sql.Time.class, new SqlTimeConverter()); 
set(java.sql.Timestamp.class, new SqlTimestampConverter()); 

तो, आप अपने dateField की सटीक रन-टाइम प्रकार पता है और इसके लिए कनवर्टर ओवरराइड करने के लिए की जरूरत है: ConverterLocator के स्रोत कोड निम्नलिखित है।

+0

इसके अलावा, अपने कोड में 'java.util.Date' का उपयोग करने से बचें। अधिक विशिष्ट प्रकारों का उपयोग करें - उदाहरण के लिए java.sql.Date' (उदाहरण के लिए जन्मतिथि), java.sql। समय के लिए समय (उदाहरण के लिए एक ट्रेन आगमन समय) और java.sql। सटीक पल के लिए टिमस्टैम्प (उदाहरण के लिए एक निर्धारित बैठक समय)। स्रोत का उपयोग करने के लिए – kan

+0

+1, यह भी कारण है कि यह अभी भी 'DateFormat.SHORT' का उपयोग क्यों कर रहा है, वे सभी इसके लिए डिफ़ॉल्ट प्रतीत होते हैं। –

+0

@ XaviLópez मैं आपको बता रहा हूं कि उसने केवल 'java.util.Date' के लिए कनवर्टर ओवरराइड किया है, लेकिन उसका वास्तविक प्रकार कुछ अलग है, शायद' java.sql.Timestamp', तो विकेट इसके बजाय डिफ़ॉल्ट का उपयोग करता है। – kan

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