2012-06-07 11 views
6

Ich versuche, einen benutzerdefinierten Formatierer (für DateTime-Felder, im Gegensatz zu java.util.Date Felder) zu schreiben, aber ich habe es schwer, dies zu arbeiten. Ich habe meine Annotation erstellt und die AnnotationFormatter-Klasse erweitert. Ich rufe play.data.format.Formatters.register (DateTime.class, new MyDateTimeAnnotationFormatter()) beim Laden der Anwendung auf, aber die Analyse- und Druckmethoden werden niemals ausgelöst.Play Framework 2.0: Benutzerdefinierte Formatierer

Wie soll ich das machen?

Edit: der Code in Frage könnte hilfreich sein;)

Die Annotation-Klasse (die stark von der Annotation-Klasse inspiriert mit Play Framework enthalten):

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

Die benutzerdefinierte Formatter-Klasse:

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

    } 

Um den Formatierer mit dem Framework zu registrieren, mache ich diesen Aufruf in einem statischen Initializer auf der Application-Klasse (es könnte sehr gut einen besseren Ort sein, um zu setzen) Dabei fühlen Sie sich frei, mir zu sagen, wo):

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

ich von Einzelschritten durch den Debugger bestätigt haben, dass dieser Aufruf gemacht wird und dass keine Fehler ausgelöst werden, aber immer noch die Forma ausgeführt wird nicht trotz die Felder DateTime wie folgt mit Anmerkungen zu versehen:

Ich bin hier Verlust.

+0

vielleicht könnten Sie Ihren Code veröffentlichen? – Somatik

+0

könnte ich in der Tat. :) Ich habe meinen ursprünglichen Post bearbeitet, um den fraglichen Code einzuschließen. –

+0

Haben Sie das gelöst? – Denis

Antwort

0

Sie müssen sich für JodaDateTime anstelle von DateTime registrieren.

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

Das ist falsch. Das erste Argument für 'register' muss der Typ sein, der von' AnnotationFormatter.parse' zurückgegeben wird. –

0

Ich hatte ein ähnliches Problem mit einem Formatierer für DateTime. Ich habe den Formatierer von meiner Global.onStart wie beschrieben here registriert. Es scheint einfach zu erstellen, die Global Klasse hat kein Neuladen ausgelöst. Sobald ich eine andere Datei geändert habe, die einen Reload ausgelöst hat (in der Konsolenausgabe als --- (RELOAD) --- gezeigt), hat es angefangen zu arbeiten. Das Stoppen und Neustarten der App sollte den gleichen Effekt haben.

Verwandte Themen