首页 > 解决方案 > 从带有弹簧启动反应器和 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 {}
}

{"id": "document"}使用杰克逊反序列化时,我最终得到一个包含两者的 bean id=documentfield=defaultValue因为它使用了为字段提供默认值的构建器。

现在我想做的是为从数据库中出来的文档设置 defaultValue (来自ReactiveMongoTemplate)。但它似乎使用了所有 args 构造函数,即使我将它设置为私有(或者有些反映黑魔法)

所以主要的问题是:从数据库出来时是否可以告诉spring使用builder来构建bean?

标签: javaspringspring-bootlombokspring-mongodb

解决方案


  • 您将无法使用您的自定义序列化程序,因为当我浏览MappingMongoConverterspring mongodb 的源代码(使用示例应用程序对其进行调试)时,我只看到以下步骤。

  • 一旦 db 中的值作为org.bson.Document,MappingMongoConverter.java正在寻找创建您的实体对象。

  • 首先,它会检查您是否注册了任何自定义转换器,如果有,请使用它。因此,一种选择是使用注册的自定义转换器。

  • 如果没有注册自定义转换器,它会找到PersistenceConstructor并使用它。我有一个带有 3 个构造函数(无参数、一个参数和所有参数)的对象,它选择了我的无参数构造函数。

  • 但是,如果我用 注释构造函数@PersistenceConstructor,它会选择该构造函数。所以可以遵循这种方法,但是你必须保持String field未初始化并在每个构造函数中以不同的方式初始化

  • MappingMongoConverter.java


推荐阅读