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?
Có vẻ hợp lý. Tuy nhiên, có 'OffsetDateTime' trong' Jsr310DateTimeFormatAnnotationFormatterFactory', nhưng nó không được định dạng là – Vic
@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