簡體   English   中英

從帶有 spring 引導反應器和 mongo 的數據庫中檢索實體時的構建器模式

[英]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=documentfield=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,您需要在代碼中添加兩個注解。

  1. 使用@JsonDeserialize注釋標記 class ,傳遞帶有構建器 class 的完全限定域名的構建器參數 - 您已經完成
  2. 將構建器 class 本身注釋為@JsonPOJOBuilder

例如:

 @JsonPOJOBuilder(buildMethodName = "create", withPrefix = "set")
 public class Builder {
    ...
 }

使用JsonPOJOBuilder

暫無
暫無

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

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