2012-06-07 15 views
6

Sto provando a scrivere un formattatore personalizzato (per i campi DateTime, al contrario dei campi java.util.Date), ma sto facendo fatica a farlo funzionare. Ho creato la mia annotazione, oltre a estendere la classe AnnotationFormatter. Chiamo play.data.format.Formatters.register (DateTime.class, new MyDateTimeAnnotationFormatter()) sul caricamento dell'applicazione, ma i metodi di analisi e stampa non si attivano mai.Play Framework 2.0: formattatori personalizzati

Come posso fare questo?

Edit: il codice in questione potrebbe essere utile;)

La classe di annotazione (fortemente ispirato dalla classe di annotazione incluso con Play quadro):

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

La classe di formattazione personalizzata:

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); 

    } 

Per registrare il formattatore con il framework, effettuo questa chiamata in un initalizer statico nella classe Application (potrebbe esserci un posto migliore dove mettere questo, sentitevi liberi di dirmi dove):

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

Ho confermato da un solo passando attraverso il debugger che questa chiamata viene fatta e che nessun errore sono gettati, ma ancora il formattatore non viene eseguito nonostante annotando i campi DateTime in modo appropriato in questo modo:

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

Sono a perdita qui.

+0

forse potresti pubblicare il tuo codice? – Somatik

+0

Potrei davvero. :) Ho modificato il mio post originale per includere il codice in questione. –

+0

Hai risolto questo? – Denis

risposta

0

È necessario registrarsi per JodaDateTime anziché DateTime.

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

Questo non è corretto. Il primo argomento di 'register' deve essere il tipo restituito da' AnnotationFormatter.parse'. –

0

Ho avuto un problema simile con un formattatore per DateTime. Stavo registrando il formattatore dal mio Global.onStart come descritto here. Sembra semplicemente creare la classe Global che non ha attivato una ricarica. Una volta modificato un altro file che ha attivato una ricarica (mostrato come --- (RELOAD) --- nell'output della console) ha iniziato a funzionare. Arrestare e riavviare la tua app dovrebbe avere lo stesso effetto.

Problemi correlati