2014-11-23 17 views
16

Tôi đã lớp sau đây mà tôi muốn để lưu trữ trong MongoDB sử dụng dữ liệu mùa xuâncửa hàng Java 8 tức thì như ngày BSON sử dụng SpringData-MongoDB

@Document() 
public class Tuple2<T extends Enum<T>> { 

@Id 
private String id; 

@Indexed 
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
private final Instant timeCreated; 

... 
} 

DateTimeFormat bang chú thích javadoc:

Tuyên bố rằng một trường phải được định dạng là ngày giờ. Hỗ trợ định dạng theo mẫu kiểu, mẫu thời gian ngày ISO hoặc chuỗi mẫu định dạng tùy chỉnh. Có thể áp dụng cho các loại java.util.Date, java.util.Calendar, java.long.Long, Joda-Time; và vào mùa xuân 4 và JDK 8, với các kiểu java.time JSR-310 nữa.

Tôi đang sử dụng Spring 4.1.1 và JDK 8, vì vậy tôi mong rằng nó sẽ áp dụng cho Instant. Tuy nhiên, đây là những gì đang thực sự được lưu trữ:

"timeCreated" : { 
    "seconds" : NumberLong(1416757496), 
    "nanos" : 503000000 
} 

Nếu tôi viết và đăng ký chuyển đổi tùy chỉnh từ tức thì đến ngày như được giải thích trong this answer sau đó nó hoạt động, tuy nhiên tôi muốn tránh điều đó, như tôi chắc chắn phải có Một cách tốt hơn.

Sau khi tiếp tục đào trong mã nguồn của mùa xuân tôi đã tìm thấy các lớp sau đây Jsr310DateTimeFormatAnnotationFormatterFactory trông đầy hứa hẹn:

định dạng lĩnh vực chú thích với các chú thích DateTimeFormat sử dụng gói java.time JSR-310 trong JDK 8.

Nguồn của nó không tham chiếu Instant, nhưng nó tham chiếu đến OffsetTime và LocalTime. Mặc dù vậy, khi tôi thay đổi Instant thành OffsetDateTime trong ví dụ của tôi, nó vẫn được lưu trữ dưới dạng đối tượng hỗn hợp thay vì ISODate.

Điều gì bị thiếu?

Trả lời

4

Tôi nghĩ rằng vấn đề là những gì bạn đang cố gắng sử dụng Instant làm thời gian. Về mặt khái niệm, nó là một điểm của dòng thời gian và nó không hàm ý định dạng.

Như chúng ta đã biết, API thời gian Java 8 được phát triển với một mắt tại thời điểm joda (và với việc chia đôi các nhà phát triển thời gian của joda). Dưới đây là bình luận từ Joda thời gian Instant:

An Instant nên được sử dụng để đại diện cho một điểm trong thời gian không phụ thuộc vào bất kỳ yếu tố khác, chẳng hạn như niên đại hoặc múi giờ.

Đó là lý do tại sao không có khả năng định dạng cho org.joda.time.Instant trong JodaDateTimeFormatAnnotationFormatterFactory xuất hiện trong Spring kể từ phiên bản 3.0. Và cũng không được triển khai trong Jsr310DateTimeFormatAnnotationFormatterFactory

Vì vậy, bạn nên sử dụng công cụ chuyển đổi tùy chỉnh hoặc cân nhắc sử dụng lớp phù hợp hơn.

+0

Có vẻ hợp lý. Tuy nhiên, có 'OffsetDateTime' trong' Jsr310DateTimeFormatAnnotationFormatterFactory', nhưng nó không được định dạng là – Vic

+0

@Vic DateTimeFormat chú thích không chịu trách nhiệm định dạng trong lưu trữ (mongodb). Nó hoạt động ở cấp ứng dụng (ví dụ: định dạng trên các trang JSP). Có bộ chuyển đổi để chuyển đổi dữ liệu thành loại appropripriate. Tôi chỉ tìm thấy 'ZonedDateTimeToCalendarConverter' cho API thời gian Java 8. Vậy bạn có thể thử sử dụng ZonedDateTime không? – retroq

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