2012-06-07 35 views
6

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.

+0

có thể bạn có thể đăng mã của mình? – Somatik

+0

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. –

+0

Bạn đã giải quyết vấn đề này chưa? – Denis

Trả lời

0

Bạn cần đăng ký JodaDateTime thay vì DateTime.

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

Điều này không đúng. Đối số đầu tiên cho 'register' phải là kiểu được trả về bởi' AnnotationFormatter.parse'. –

0

Tôi gặp sự cố tương tự với trình định dạng cho DateTime. Tôi đã đăng ký trình định dạng từ số Global.onStart của mình như được mô tả here. Có vẻ như việc tạo lớp Global không kích hoạt tải lại. Một khi tôi sửa đổi một tập tin khác mà kích hoạt một tải lại (hiển thị như --- (RELOAD) --- trong đầu ra giao diện điều khiển) nó bắt đầu làm việc. Dừng và khởi động lại ứng dụng của bạn sẽ có tác dụng tương tự.

Các vấn đề liên quan