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.
peut-être pourriez-vous écrire votre code? – Somatik
Je pourrais en effet. :) J'ai modifié mon message original pour inclure le code en question. –
Avez-vous résolu ceci? – Denis