[英]How to convert the MongoDB object id to a Java Date or Instant using Java
[英]How to save Java 8 Instant to MongoDB as Date type using Spring MongoTemplate?
我有一個具有Instant
類型成員變量的Java類:
public class SomeRecord {
private String someId;
private Instant someInstant;
// getters and setters
}
我使用MongoTemplate更新數據庫中的someInstant
字段:
public SomeRecord updateSomeRecordBySomeId(final String someId, Object someInstant) {
Query query = new Query();
query.addCriteria(Criteria.where("someId").is(someId));
Update update = new Update();
update.set("someInstant", someInstant);
return operations.findAndModify(query, update, new FindAndModifyOptions().returnNew(true), SomeRecord.class);
}
如果我將方法調用為:
updateSomeRecordBySomeId("SOME-ID", Instant.now());
將數據庫中的字段保存為Date
類型: "someInstant" : ISODate("2017-07-11T07:26:44.269Z")
現在該方法也可以被稱為: updateSomeRecordBySomeId("SOME-ID", "2017-07-11T07:26:44.269Z");
在這種情況下,我得到一個例外:
org.springframework.core.convert.ConverterNotFoundException:找不到能夠從類型[java.lang.String]轉換為類型[java.time.Instant]的轉換器
這完全有道理。 (它將DB中的字段更新為String
。 "someInstant" : "2017-07-11T07:26:44.269Z"
)
MongoConfig.java:
public class StringToInstantConverter implements Converter<String, Instant> {
@Override
public Instant convert(String utcString) {
// TODO: Make it generic for any time-zone
return Instant.parse(utcString);
}
}
StringToInstantConverter.java:
public class StringToInstantConverter implements Converter<String, Instant> { @Override public Instant convert(String utcString) { // TODO: Make it generic for any time-zone return Instant.parse(utcString); } }
添加上面的轉換器后,我不再獲得ConverterNotFoundException
,但字段someInstant
被保存為普通字符串: "someInstant" : "2017-07-11T07:26:44.269Z"
這就是我的問題所在。 我知道正在識別轉換器,這就是我不再獲得異常的原因。 但是為什么轉換器沒有將String
轉換為Instant
? 為什么字段被保持為普通String
? 轉換器供應不正確嗎? 如何為這種情況編寫轉換器?
注意:
我簡化了代碼以專注於實際問題。 實際上,該方法不接收someInstant
字段作為參數。 因此,編寫重載方法不適用於此。 此外,方法內的任何類型的instanceOf
檢查都不適用於實際場景。 所以關注的重點是為什么轉換沒有發生?
我們的實際數據存儲是DocumentDB,但我們使用DocumentDB和MongoDB API (因為Spring Data不支持DocumentDB)來進行數據庫操作。
您的更新邏輯以類型不可知的方式編寫:您可以傳遞任何對象類型(整數,長整數,布爾值,字符串,日期等),並通過使用新值和新類型覆蓋現有值/類型將其保留在DB中。 注意:面向文檔的數據庫像MongoDB一樣沒有固定的模式,因此存儲的數據可以隨意更改數據類型。
您在使用ConverterNotFoundException
引入轉換ConverterNotFoundException
之前遇到的問題不是在更新操作期間,而是在檢索更新的對象並將其設置為Java bean模型期間:Java類將someInstant
屬性定義為Instant
/ Date
類型,但數據庫提供了String
值。
介紹轉換器后,解決了讀取問題,但僅限於String
和Date
類型。 如果使用某個boolean
值更新someInstant
屬性,則會回到該問題以讀取對象並將其映射到Java bean。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.