2012-06-07 14 views
6

मैं एक कस्टम फॉर्मेटर लिखने की कोशिश कर रहा हूं (डेटटाइम फ़ील्ड्स के लिए, java.util.Date फ़ील्ड्स के विपरीत), लेकिन इसे काम करने में मुश्किल हो रही है। मैंने अपनी एनोटेशन बनाई है, साथ ही एनोटेशनफॉर्मेटर क्लास को बढ़ाया है। मैं play.data.format.Formatters.register (DateTime.class, नया MyDateTimeAnotationFormatter()) को एप्लिकेशन लोड पर कॉल करता हूं, लेकिन पार्स और प्रिंट विधियां कभी भी ट्रिगर नहीं होती हैं।प्ले फ्रेमवर्क 2.0: कस्टम फॉर्मेटर्स

मुझे यह कैसे करना चाहिए?

संपादित करें: प्रश्न में कोड उपयोगी हो सकता है;)

एनोटेशन वर्ग (भारी एनोटेशन वर्ग से प्रेरित प्ले फ्रेमवर्क) के साथ शामिल:

@Target({ FIELD }) 
@Retention(RUNTIME) 
@play.data.Form.Display(name = "format.datetime", attributes = { "pattern" }) 
public static @interface JodaDateTime { 
    String pattern(); 
} 

कस्टम फ़ॉर्मेटर वर्ग:

public static class AnnotationDateTimeFormatter extends AnnotationFormatter<JodaDateTime, DateTime> { 

    @Override 
    public DateTime parse(JodaDateTime annotation, String text, Locale locale) throws ParseException { 
     if (text == null || text.trim().isEmpty()) { 
      return null; 
     } 

     return DateTimeFormat.forPattern(annotation.pattern()).withLocale(locale).parseDateTime(text); 
    } 

    @Override 
    public String print(JodaDateTime annotation, DateTime value, Locale locale) { 
     if (value == null) { 
      return null; 
     } 

     return value.toString(annotation.pattern(), locale); 

    } 

फ्रेमवर्क के साथ फॉर्मेटर पंजीकृत करने के लिए, मैं इस कॉल को एप्लिकेशन क्लास पर एक स्थिर इनटाइलाइज़र में डालता हूं (वहां बहुत अच्छी जगह हो सकती है इस, मुझे बताने की जहां) के लिए स्वतंत्र महसूस:

play.data.format.Formatters.register(DateTime.class, new AnnotationDateTimeFormatter()); 

मैं डिबगर है कि इस फोन किया जाता है और कहा कि कोई त्रुटि फेंक दिया जाता है, फिर भी अभी भी फ़ॉर्मेटर बावजूद नहीं चला है के माध्यम से एकल कदम द्वारा की पुष्टि की है डेटटाइम फ़ील्ड को इस तरह उचित तरीके से एनोटेट करने के लिए:

@Formats.JodaDateTime(pattern = "dd.MM.yyyy HH:mm:ss") 
public DateTime timeOfRequest = new DateTime(); 

मुझे यहां नुकसान हो रहा है।

+0

शायद आप अपना कोड पोस्ट कर सकते हैं? – Somatik

+0

मैं वास्तव में कर सकता था। :) मैंने प्रश्न में कोड शामिल करने के लिए अपनी मूल पोस्ट संपादित की। –

+0

क्या आपने इसे हल किया है? – Denis

उत्तर

0

आपको डेटटाइम के बजाय जोडाडेट टाइम के लिए पंजीकरण करने की आवश्यकता है।

play.data.format.Formatters.register(JodaDateTime.class, new AnnotationDateTimeFormatter()); 
+1

यह गलत है। 'रजिस्टर' के लिए पहला तर्क 'AnnotationFormatter.parse' द्वारा लौटाया गया प्रकार होना चाहिए। –

0

मैं DateTime के लिए एक फ़ॉर्मेटर के साथ एक समान समस्या थी। मैं वर्णित के रूप में मेरे Global.onStart से फॉर्मेटर पंजीकृत कर रहा था। ऐसा लगता है कि Global वर्ग को फिर से लोड करना ट्रिगर नहीं हुआ है। एक बार जब मैंने एक और फ़ाइल संशोधित की जो एक रीलोड ट्रिगर किया गया (कंसोल आउटपुट में --- (RELOAD) --- के रूप में दिखाया गया) तो यह काम करना शुरू कर दिया। अपने ऐप को रोकना और पुनरारंभ करना एक ही प्रभाव होना चाहिए।

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