I am trying to have a list in a model using @DBRef but I can't get it to work.
This is my User model:
@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;
}
Server model:
@Data
@Document
public class Server {
@Id
@JsonSerialize(using = ToStringSerializer.class)
private ObjectId id;
@NotBlank
private String name;
@NotBlank
private String host;
}
The structure is very simple, every user can have multiple servers. But when I add servers to the user the server is created, but the servers array contains one null entry("servers" : [ null ]). So the server isn't added to the user. This is how I create a server and add it to an user:
@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);
}
So I simply create and save a server, add the server the user and then save the user. But it doesn't work. I keep having an array with one null entry.
I've seen this page: http://www.baeldung.com/cascading-with-dbref-and-lifecycle-events-in-spring-data-mongodb. But it is for saving the child document, not for linking it. Also it is for a single document, not for an array or list.
Why is my list not being saved correctly?
All my libraries are coming from spring boot version 2.0.0.M6.
UPDATE
When removing @DBRef from the user's servers property the servers are getting saved, but they of course get double created, in the server collection and in every user.servers. So the error has something to do with references.