[英]Builder pattern when retrieving entity from DB w/ spring boot reactor & mongo
我有以下描述 mongo 文檔並使用 lombok 的 bean:
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
@Builder(toBuilder = true)
@Value
public class MyClass {
private final String id;
@Default
private final String field = "defaultValue";
@JsonPOJOBuilder(withPrefix = "")
public static class MyClassBuilder {}
}
當使用 jackson 反序列化{"id": "document"}
時,我最終得到了一個包含id=document
和field=defaultValue
的 bean,因為它使用了為字段提供默認值的構建器。
現在我想做的是為來自數據庫的文檔(來自ReactiveMongoTemplate
)設置 defaultValue 。 但它似乎使用了所有 args 構造函數,即使我將它設置為私有(或者有些反映黑魔法)
所以主要的問題是:從數據庫出來時是否可以告訴 spring 使用構建器來構建 bean?
您將無法使用您的自定義序列化程序,因為當我通過 spring mongodb 中的MappingMongoConverter
的源代碼進行 go 時,請參見以下示例步驟。
一旦 db 中的值作為org.bson.Document
可用, MappingMongoConverter.java
就會尋找創建您的實體 object。
首先,它會檢查您是否注冊了任何自定義轉換器,如果有,請使用它。 因此,一種選擇是使用注冊的自定義轉換器。
如果沒有注冊自定義轉換器,它會找到PersistenceConstructor
並使用它。 我有一個帶有 3 個構造函數(無參數、一個參數和所有參數)的 object,它選擇了我的無參數構造函數。
但是,如果我使用@PersistenceConstructor
注釋構造函數,它會選擇該構造函數。 所以可以遵循這種方法,但是你必須保持String field
未初始化並在每個構造函數中以不同方式初始化
MappingMongoConverter.java
將 Builder 與 Lombok 一起使用的正確方法是使用以下注解:
@NoArgsConstructor
@AllArgsConstructor
@Builder
為了使 Jackson 解串器使用這個 Builder,您需要在代碼中添加兩個注解。
@JsonDeserialize
注釋標記 class ,傳遞帶有構建器 class 的完全限定域名的構建器參數 - 您已經完成@JsonPOJOBuilder
例如:
@JsonPOJOBuilder(buildMethodName = "create", withPrefix = "set")
public class Builder {
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.