java - 从带有弹簧启动反应器和 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=document
,field=defaultValue
因为它使用了为字段提供默认值的构建器。
现在我想做的是为从数据库中出来的文档设置 defaultValue (来自ReactiveMongoTemplate
)。但它似乎使用了所有 args 构造函数,即使我将它设置为私有(或者有些反映黑魔法)
所以主要的问题是:从数据库出来时是否可以告诉spring使用builder来构建bean?
解决方案
您将无法使用您的自定义序列化程序,因为当我浏览
MappingMongoConverter
spring mongodb 的源代码(使用示例应用程序对其进行调试)时,我只看到以下步骤。一旦 db 中的值作为
org.bson.Document
,MappingMongoConverter.java
正在寻找创建您的实体对象。首先,它会检查您是否注册了任何自定义转换器,如果有,请使用它。因此,一种选择是使用注册的自定义转换器。
如果没有注册自定义转换器,它会找到
PersistenceConstructor
并使用它。我有一个带有 3 个构造函数(无参数、一个参数和所有参数)的对象,它选择了我的无参数构造函数。但是,如果我用 注释构造函数
@PersistenceConstructor
,它会选择该构造函数。所以可以遵循这种方法,但是你必须保持String field
未初始化并在每个构造函数中以不同的方式初始化MappingMongoConverter.java
推荐阅读
- angular - 按钮不采用 Angular Material UI 主题
- replaykit - 从 CMSampleBuffer 获取所有帧数据
- javascript - 带有 React 的 Redux 存储未定义
- jquery - 使用 if-else 语句在单击时隐藏显示 div 和添加删除类
- c# - 如何从 C# 的 Code Runner(VSCode 扩展)运行命令中删除文件路径?
- amazon-web-services - AWS Amplify 和 Elastic Beanstalk 之间的安全连接
- go - 元胞自动机的观察者模式或发布/订阅模式
- javascript - 从数组中给出对象值的每个属性
- javascript - 从对象数组中删除属性,内存影响
- flutter - 为什么视频在颤动的 VideoPlayer 中不是全屏的?