簡體   English   中英

如何使用Spring MongoTemplate將Java 8 Instant作為日期類型保存到MongoDB?

[英]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值。

介紹轉換器后,解決了讀取問題,但僅限於StringDate類型。 如果使用某個boolean值更新someInstant屬性,則會回到該問題以讀取對象並將其映射到Java bean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM