Spring数据mongodb @DBRef列表

时间:2017-11-22 16:10:58

标签: spring mongodb reactive-programming spring-webflux dbref

我正在尝试使用@DBRef在模型中列出一个列表,但我无法让它工作。 这是我的用户模型:

@Data
@Document
public class User {

    @Id
    @JsonSerialize(using = ToStringSerializer.class)
    private ObjectId id;

    @Indexed(unique = true)
    @NotBlank
    private String email;

    @NotBlank
    private String name;

    @NotBlank
    private String password;

    @DBRef
    private List<Server> servers;
}

服务器型号:

@Data
@Document
public class Server {

    @Id
    @JsonSerialize(using = ToStringSerializer.class)
    private ObjectId id;

    @NotBlank
    private String name;

    @NotBlank
    private String host;
}

结构非常简单,每个用户都可以拥有多个服务器。但是当我向用户添加服务器时,服务器已创建,但servers数组包含一个null条目("servers" : [ null ])。因此服务器不会添加到用户。这就是我创建服务器并将其添加到用户的方式:

@PostMapping
public Mono create(@Valid @RequestBody Server server, Mono<Authentication> authentication) {
    return this.serverRepository.save(server).then(authentication.flatMap(value -> {
        User user = (User) value.getDetails();
        user.getServers().add(server);

        return userRepository.save(user);
    })).map(value -> server);
}

所以我只需创建并保存服务器,将服务器添加到用户,然后保存用户。但它不起作用。我一直有一个null条目的数组。

我看过这个页面:http://www.baeldung.com/cascading-with-dbref-and-lifecycle-events-in-spring-data-mongodb。但是它用于保存子文档,而不是用于链接它。它也适用于单个文档,而不适用于数组或列表。

为什么我的列表没有正确保存?

我的所有库都来自spring boot version 2.0.0.M6

更新 从用户的服务器属性中删除@DBRef时,服务器将被保存,但它们当然会在server集合和每个user.servers中被双重创建。所以错误与引用有关。

2 个答案:

答案 0 :(得分:2)

经过一些谷歌搜索后,我找到了答案...... https://jira.spring.io/browse/DATAMONGO-1583
https://jira.spring.io/browse/DATAMONGO-1584

Reactive mongo不支持此功能。

答案 1 :(得分:0)

实际上有一种方法可以在不使用阻塞驱动程序的情况下解析DbRef。是 - 引用以阻塞方式解析,但不需要第二次连接。为了实现这一点,我们必须编写自己的DbRefResolver:NbDbRefResolver.java。在提供的解析器中有一个标志:RESOLVE_DB_REFS_BY_ID_ONLY。如果打开将不会从数据库中解析DbRef,而是将它们解析为仅具有id的伪对象。由实现以后以非阻塞方式填充引用。

如果标志RESOLVE_DB_REFS_BY_ID_ONLY设置为false,它将使用非阻塞驱动程序急切地解析引用,但会阻止执行直到引用被解析。 以下是如何在应用程序中注册DbRefResolver:DbConfig.kt

此处提供了附加的文件:https://jira.spring.io/browse/DATAMONGO-1584