2012-06-07 3 views
6

Я пытаюсь написать собственный форматированный (для полей DateTime, в отличие от полей java.util.Date), но мне трудно заставить это работать. Я создал свою аннотацию, а также расширил класс AnnotationFormatter. Я вызываю play.data.format.Formatters.register (DateTime.class, новый MyDateTimeAnnotationFormatter()) при загрузке приложения, но методы разбора и печати никогда не запускаются.Play Framework 2.0: Пользовательские форматировщики

Как я должен это делать?

Edit: код в вопросе может быть полезным;)

Класс аннотаций (сильно вдохновлен классом аннотаций включен Play Framework):

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

    } 

Чтобы зарегистрировать форматтер с фреймворком, я вызываю этот вызов в статическом инициализаторе класса Application (может быть, лучше всего разместить место это, не стесняйтесь сказать мне, где):

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

Я подтвердил пошагово через отладчик, что этот вызов получает из и что никаких ошибок не выбрасываются, но до сих пор форматировщик не запускаются, несмотря аннотирования полей DateTime следующим образом:

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

Я здесь в убытке.

+0

Возможно, вы сможете оставить свой код? – Somatik

+0

Я действительно мог. :) Я редактировал свое оригинальное сообщение, чтобы включить этот код. –

+0

Вы решили это? – Denis

ответ

0

Вам необходимо зарегистрироваться для JodaDateTime вместо DateTime.

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

Это неверно. Первым аргументом 'register' должен быть тип, возвращаемый' AnnotationFormatter.parse'. –

0

У меня была аналогичная проблема с форматировщику для DateTime. Я зарегистрировал форматтер из моего Global.onStart, как описано here. Кажется, просто создание класса Global не вызвало перезагрузки. Как только я изменил другой файл, который вызвал перезагрузку (отображается как --- (RELOAD) --- на выходе консоли), он начал работать. Остановка и перезапуск приложения должны иметь тот же эффект.

Смежные вопросы