Tôi đang cố viết một trình định dạng tùy chỉnh (cho các trường DateTime, trái ngược với các trường java.util.Date), nhưng có một thời gian khó khăn để làm việc này. Tôi đã tạo chú thích của mình, cũng như mở rộng lớp AnnotationFormatter. Tôi gọi play.data.format.Formatters.register (DateTime.class, new MyDateTimeAnnotationFormatter()) trên tải ứng dụng, nhưng các phân tích cú pháp và phương thức in không bao giờ kích hoạt.Chơi Framework 2.0: Các trình định dạng tùy chỉnh
Tôi phải làm như thế nào?
Chỉnh sửa: mã trong câu hỏi có thể hữu ích;)
Lớp chú thích (chủ yếu lấy cảm hứng từ lớp chú thích kèm với Play Framework):
@Target({ FIELD })
@Retention(RUNTIME)
@play.data.Form.Display(name = "format.datetime", attributes = { "pattern" })
public static @interface JodaDateTime {
String pattern();
}
Lớp formatter tùy chỉnh:
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);
}
Để đăng ký trình định dạng với khung công tác, tôi thực hiện cuộc gọi này trong bộ phận initalizer tĩnh trên lớp Ứng dụng (có thể có một nơi tốt hơn để đặt này, cảm thấy tự do để cho tôi biết ở đâu):
play.data.format.Formatters.register(DateTime.class, new AnnotationDateTimeFormatter());
Tôi đã xác nhận bởi đơn bước qua debugger rằng cuộc gọi này được thực hiện và rằng không có lỗi được ném, nhưng vẫn formatter không chạy mặc dù chú thích các trường DateTime thích hợp như sau:
@Formats.JodaDateTime(pattern = "dd.MM.yyyy HH:mm:ss")
public DateTime timeOfRequest = new DateTime();
Tôi bị mất ở đây.
có thể bạn có thể đăng mã của mình? – Somatik
Tôi thực sự có thể. :) Tôi đã chỉnh sửa bài đăng gốc của mình để bao gồm mã được đề cập. –
Bạn đã giải quyết vấn đề này chưa? – Denis