2012-06-07 23 views
6

Próbuję napisać niestandardowy formater (dla pól DateTime, w przeciwieństwie do pól java.util.Date), ale mam trudności z uruchomieniem tego. Utworzyłem adnotację, a także rozszerzyłem klasę AnnotationFormatter. Używam play.data.format.Formatters.register (DateTime.class, new MyDateTimeAnnotationFormatter()) podczas ładowania aplikacji, ale metody analizy i drukowania nigdy nie są wyzwalane.Play Framework 2.0: Niestandardowe formatery

Jak mam to zrobić?

Edit: kod w pytaniu może być pomocne;)

Klasa adnotacji (mocno inspirowane przez klasę adnotacji dołączone Gra Framework):

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

Klasa zwyczaj formater:

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

    } 

Aby zarejestrować formater z frameworkiem, wywołuję to w statycznym initalizerze na klasie Application (może być tam lepiej miejsce do umieszczenia Ten, nie krępuj mi powiedzieć gdzie):

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

Mam potwierdzone przez single-stepping przez debugger, że ta rozmowa zostanie wykonana i że żadne błędy są wyrzucane, ale nadal formater nie jest prowadzony na przekór z adnotacją pól DateTime odpowiednio:

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

Jestem w tej sytuacji.

+0

Może mógłbyś napisać swój kod? – Somatik

+0

Mogłem rzeczywiście. :) Zmieniłem mój pierwotny post, aby uwzględnić dany kod. –

+0

Rozwiązałeś to? – Denis

Odpowiedz

0

Musisz zarejestrować się w JodaDateTime zamiast w DateTime.

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

To jest nieprawidłowe. Pierwszym argumentem dla 'register' musi być typ zwracany przez' AnnotationFormatter.parse'. –

0

miałem podobny problem z formater dla DateTime. Rejestruję formater z mojego Global.onStart zgodnie z opisem here. Wygląda na to, że tworzenie klasy Global nie spowodowało ponownego załadowania. Po zmodyfikowaniu innego pliku, który spowodował ponowne załadowanie (pokazane jako --- (RELOAD) --- w wyjściu konsoli), zaczął działać. Zatrzymywanie i ponowne uruchamianie aplikacji powinno mieć taki sam efekt.