gpt4 book ai didi

spring-mvc - Spring 和 MongoDB : Saving Value Objects in a more flat way

转载 作者:行者123 更新时间:2023-12-04 13:47:31 24 4
gpt4 key购买 nike

对于我正在设计和开发的新 Spring 应用程序,出于多种技术原因,我们使用 MongoDB 作为持久层。这是我尝试实现一些 DDD 原则(包括值对象)的第一个项目。我试图找到保存 ValueObject 的最佳方法,它实际上只是一个字符串。使用 Lombok 的 @Value,我的 Spring REST Controller 愉快地将值解析为 RestController 端的 ValueObject。但是当保存值时,它会以结构化的方式保存在 MongoDB 端。

例如

我的声音:

@Value
public class PersonKey {
private String value;
}

我将存储在 MongoDB 中的文档:
@Document
public class PersonDocument {
private PersonKey personKey;
private Name name;
...
}

什么被保存在 MongoDB 中:
{.. "personKey": {"value": "faeeaf2"} ...}

我真正想要的是:
{.. "personKey": "faeeaf2" ..}

当然用最少的额外样板代码.. :-)

最佳答案

似乎您唯一的选择是使用 AbstractMongoEventListeneronAfterConvert方法修改DBObject转换后。不幸的是,无法轻松更改文档中单个字段的转换。保存整个文档时使用自定义转换器,而不是单个字段。您也不能使用 getter 方法来替换字段访问(“对象的字段用于在文档中的字段之间进行转换。未使用公共(public) JavaBean 属性。”来自 http://docs.spring.io/spring-data/data-mongo/docs/1.4.2.RELEASE/reference/html/mapping-chapter.html)。因此,实现您想要的唯一方法是通过 mongodb 事件。但是,您可以在事件处理程序中使用反射来检查字段是否使用 @Value 进行注释。注释,因此可以以更通用的方式对其进行转换。如 @Value存在注释,只需将其替换为 DBObject有了它的值(value)属性。

为此,您需要扩展 AbstractMongoEventListener .您可以使用 onBeforeSave 在此处查看示例事件处理程序:

https://github.com/ttrelle/spring-data-examples/blob/master/springdata-mongodb/src/main/java/mongodb/OrderBeforeSaveListener.java

更新:
正如@maartinus 在评论中注意到的,使用反射搜索 @Value对象将不起作用,因为它在运行时不可用(保留设置为 SOURCE )。因此,您需要使用单一方法 ValueObject 引入您自己的注解或接口(interface)(例如 value() )这将返回对象的值。

关于spring-mvc - Spring 和 MongoDB : Saving Value Objects in a more flat way,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43274725/

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