gpt4 book ai didi

java - 使用 Spring Boot reactor 和 mongo 从 DB 检索实体时的构建器模式

转载 作者:行者123 更新时间:2023-12-04 17:26:36 25 4
gpt4 key购买 nike

我有以下描述 mongo 文档的 bean,它使用 lombok:

@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"}和 jackson 一起,我最终得到了一个包含两者的 bean id=documentfield=defaultValue因为它使用了为该字段提供默认值的构建器。
现在我想要做的是为来自数据库(来自 ReactiveMongoTemplate )的文档设置 defaultValue 。但它似乎使用 all args 构造函数,即使我将其设置为私有(private)(或一些反射(reflect)黑魔法)
所以主要问题是:是否可以告诉spring在从数据库中出来时使用builder来构建bean?

最佳答案

  • 您将无法使用自定义序列化程序,因为当我查看 MappingMongoConverter 的源代码时在 spring mongodb(用示例应用程序调试)中,我只看到以下步骤。
  • 一旦来自 db 的值可用 org.bson.Document , MappingMongoConverter.java正在寻找创建您的实体对象。
  • 首先,它会检查您是否注册了任何自定义转换器,如果有,则使用它。因此,一种选择是使用注册的自定义转换器。
  • 如果没有注册自定义转换器,它会去寻找 PersistenceConstructor并使用它。我有一个带有 3 个构造函数(无参数、一个参数和所有参数)的对象,它选择了我的无参数构造函数。
  • 但是,如果我用 @PersistenceConstructor 注释构造函数,它正在选择那个构造函数。所以可以遵循这种方法,但你必须保留 String field在每个构造函数中未初始化和初始化不同
  • MappingMongoConverter.java
  • conversions.hasCustomReadTarget
  • persistenceConstructor

  • 关于java - 使用 Spring Boot reactor 和 mongo 从 DB 检索实体时的构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62829228/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com