2012-06-07 6 views
6

J'essaye d'écrire un formateur personnalisé (pour les champs DateTime, par opposition aux champs java.util.Date), mais j'ai du mal à le faire fonctionner. J'ai créé mon annotation, ainsi que la classe AnnotationFormatter. J'appelle play.data.format.Formatters.register (DateTime.class, new MyDateTimeAnnotationFormatter()) lors du chargement de l'application, mais les méthodes d'analyse et d'impression ne se déclenchent jamais.Play Framework 2.0: Formateries personnalisées

Comment suis-je censé faire cela?

Edit: le code en question pourrait être utile;)

La classe d'annotation (fortement inspirée par la classe d'annotation inclus avec le cadre de lecture):

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

La classe formatter personnalisée:

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

    } 

Pour enregistrer le formateur avec l'infrastructure, je fais cet appel dans un initalizer statique sur la classe Application (il pourrait très bien y avoir un meilleur endroit pour mettre cela, ne hésitez pas à me dire où):

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

J'ai confirmé par un seul pas à pas dans le débogueur que cet appel se fait et qu'aucune erreur ne sont jetés, mais toujours le formatter est pas exécuté malgré d'annoter les champs DateHeure de manière appropriée comme ceci:

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

Je suis à la perte ici.

+0

peut-être pourriez-vous écrire votre code? – Somatik

+0

Je pourrais en effet. :) J'ai modifié mon message original pour inclure le code en question. –

+0

Avez-vous résolu ceci? – Denis

Répondre

0

Vous devez vous inscrire à JodaDateTime au lieu de DateTime.

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

Ceci est incorrect. Le premier argument de 'register' doit être le type retourné par' AnnotationFormatter.parse'. –

0

J'ai eu un problème similaire avec un formateur pour DateTime. J'enregistrais le formateur de mon Global.onStart comme décrit here. Il semble que la simple création de la classe Global n'a pas déclenché de rechargement. Une fois que j'ai modifié un autre fichier qui a déclenché un rechargement (représenté par --- (RELOAD) --- dans la sortie de la console), il a commencé à fonctionner. L'arrêt et le redémarrage de votre application devraient avoir le même effet.

Questions connexes