2012-06-07 34 views
6

Estoy tratando de escribir un formateador personalizado (para los campos DateTime, a diferencia de los campos java.util.Date), pero estoy teniendo dificultades para hacer que esto funcione. Creé mi anotación y extendí la clase AnnotationFormatter. Llamo a play.data.format.Formatters.register (DateTime.class, new MyDateTimeAnnotationFormatter()) en la carga de la aplicación, pero los métodos de análisis e impresión nunca se desencadenan.Play Framework 2.0: Formateadores personalizados

¿Cómo se supone que debo hacer esto?

Editar: el código en cuestión podría ser útil;)

La clase de anotación (en gran medida inspirado en la clase de anotación incluye con Marco de Juego):

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

La clase de formateador personalizado:

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

    } 

Para registrar el formateador con el marco, hago esta llamada en un iniciador estático en la clase de aplicación (podría haber un lugar mejor para poner esto, no dude en decirme dónde):

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

He confirmado por un solo paso a paso por el depurador que esta llamada se hizo y que no hay errores se tiran, y aún así el formateador no se ejecuta a pesar de la anotación de los campos DateTime apropiadamente así:

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

estoy en la pérdida aquí.

+0

¿Tal vez podría publicar su código? – Somatik

+0

Podría de hecho. :) Edité mi publicación original para incluir el código en cuestión. –

+0

¿Has resuelto esto? – Denis

Respuesta

0

Debe registrarse para JodaDateTime en lugar de DateTime.

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

Esto es incorrecto. El primer argumento para 'registrar' debe ser el tipo devuelto por 'AnnotationFormatter.parse'. –

0

He tenido un problema similar con un formateador para DateTime. Estaba registrando el formateador de mi Global.onStart como se describe here. Parece simplemente crear la clase Global no desencadenó una recarga. Una vez que modifiqué otro archivo que activó una recarga (que se muestra como --- (RELOAD) --- en la salida de la consola), comenzó a funcionar. Detener y reiniciar su aplicación debería tener el mismo efecto.

Cuestiones relacionadas