2011-11-09 24 views
6

Tôi đã nghiên cứu cẩn thận Jonik's entry về tùy chỉnh định dạng BigDecimal trong Wicket. Cảm ơn vì đoạn mã tuyệt vời này. Thật không may tôi không thể làm cho nó hoạt động cho trường hợp sử dụng của tôi.Đăng ký toàn cầu định dạng trường trong Wicket

Tôi muốn đăng ký định dạng ngày tháng trên toàn cầu và đang sử dụng đoạn mã sau trong subclass Ứng dụng:

@Override 
protected IConverterLocator newConverterLocator() { 
    ConverterLocator converterLocator = new ConverterLocator(); 
    converterLocator.set(Date.class, new DateConverter() { 

     @Override 
     public DateFormat getDateFormat(Locale ignore) { 
      return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 
     } 

    }); 
    return converterLocator; 
} 

Sau đó, khi sử dụng trường ngày trong các trang web mã là như sau:

form.add(new TextField<Date>("dateField")); 

Khi được hiển thị, các trường ngày tháng hiển thị định dạng chuẩn java.text.DateFormat.SHORT (02.11.11 11:59) đến từ lớp org.apache.wicket.util.convert.converter.DateConverter thay vì tùy chỉnh SimpleDateFormat của tôi (02.11.2011 11:59:42).

Tôi đã kiểm tra xem java.util.Date có đang được sử dụng trong suốt không. Phiên bản Wicket là 1.4.12.

Bất kỳ ý tưởng nào?

+0

Tính năng này hoạt động tốt trong phiên bản 1.4.12, sử dụng TextField mới ("dateField", Mô hình mới (new Date())). Mô hình của TextField là gì? Nếu Biểu mẫu có một CompoundPropertyModel, lớp nào là thuộc tính dateField xử lý thành? –

+0

Cảm ơn Xavi. Biểu mẫu là một 'CompoundPropertyModel' đề cập đến một thực thể persistence có' dateField' là java.util.Date. Vì chúng ta đang sử dụng các thực thể bền vững, các trường ở cuối các chuỗi getter/setter là các kiểu dữ liệu Java thô, chứ không phải các triển khai thực hiện của IModel. Đây có phải là vấn đề không? –

+0

Bạn có chắc chắn rằng 'newConverterLocator()' đang được sử dụng không? Bạn đã sửa lỗi thông qua 'Component.getConverter (Class)' để xem những gì đang xảy ra? Bạn có thể làm điều này dễ dàng đặt một điểm ngắt trong ghi đè trong thành phần cụ thể này. –

Trả lời

5

Tôi nghĩ rằng dateField của bạn có loại java.util.Date, nhưng đối tượng thực tế (được tải từ cơ sở dữ liệu?) Là v.d. java.sql.Timestamp hoặc một số trẻ khác của java.util.Date. Đó là lý do tại sao ConverterLocator chọn trình chuyển đổi khác thay cho công cụ chuyển đổi của bạn. Mã nguồn của ConverterLocator có sau đây:

set(Date.class, new DateConverter()); 
set(Calendar.class, new CalendarConverter()); 
set(java.sql.Date.class, new SqlDateConverter()); 
set(java.sql.Time.class, new SqlTimeConverter()); 
set(java.sql.Timestamp.class, new SqlTimestampConverter()); 

Vì vậy, bạn cần phải biết loại thời gian chạy chính xác của dateField của bạn và ghi đè lên chuyển đổi cho nó.

+0

Ngoài ra, tránh sử dụng 'java.util.Date' trong mã của bạn. Sử dụng các kiểu cụ thể hơn - 'java.sql.Date' cho một ngày (ví dụ: ngày sinh), java.sql.Time trong một thời gian (ví dụ: thời gian đến của tàu) và java.sql.Timestamp cho thời điểm chính xác của thời gian (ví dụ như thời gian họp theo lịch trình). – kan

+0

+1 để sử dụng nguồn, điều này cũng rất có thể là lý do tại sao nó vẫn sử dụng 'DateFormat.SHORT', tất cả chúng dường như mặc định với nó. –

+0

@ XaviLópez Tôi đang nói với bạn rằng anh ta đã ghi đè lên trình chuyển đổi cho 'java.util.Date' chỉ, nhưng loại thực tế của anh ta có gì đó khác biệt, có lẽ là' java.sql.Timestamp', vì vậy wicket sử dụng trình thay thế mặc định. – kan

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