Я пытался работать с неизменяемыми объектами в MongoDB и Lombok. Я нашел решение своей проблемы, но для этого нужно написать дополнительный код из docs , но мне нужно использовать аннотации Bson и создать конструктор, который описывает поля с помощью аннотаций. Но если я использую @AllArgsConstructor, поймать исключение: «Не удается найти конструктор publi c для« Пользователя »», потому что я не могу использовать конструктор по умолчанию с конечными полями. Я думаю, что могу правильно настроить CodecRegistry, и пример будет работать правильно, но я не смог найти решение для этого в документации, Google и Stackoverflow.
Есть ли способ решить эту проблему?
@Data
@Builder(builderClassName = "Builder")
@Value
@BsonDiscriminator
public class User {
private final ObjectId id;
private final String name;
private final String pass;
private final String login;
private final Role role;
@BsonCreator
public User(@BsonProperty("id") final ObjectId id,
@BsonProperty("name") final String name,
@BsonProperty("pass") final String pass,
@BsonProperty("login") final String login,
@BsonProperty("role") final Role role) {
this.id = id;
this.name = name;
this.pass = pass;
this.login = login;
this.role = role;
}
@AllArgsConstructor
public enum Role {
USER("USER"),
ADMIN("ADMIN"),
GUEST("GUEST");
@Getter
private String value;
}
public static class Builder {
}
}
Пример для MongoDB, где я создаю, сохраняю и затем обновляю пользователей:
public class ExampleMongoDB {
public static void main(String[] args) {
final MongoClient mongoClient = MongoClients.create();
final MongoDatabase database = mongoClient.getDatabase("db");
database.drop();
final CodecRegistry pojoCodecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));
final MongoCollection<User> users = database.getCollection("users", User.class).withCodecRegistry(pojoCodecRegistry);
users.insertMany(new ExampleMongoDB().getRandomUsers());
System.out.println("Before updating:");
users.find(new Document("role", "ADMIN")).iterator().forEachRemaining(
System.out::println
);
System.out.println("After updating:");
users.updateMany(eq("role", "ADMIN"), set("role", "GUEST"));
users.find(new Document("role", "GUEST")).iterator().forEachRemaining(
System.out::println
);
}
public List<User> getRandomUsers() {
final ArrayList<User> users = new ArrayList<>();
for (int i = 0; i < 15; i++) {
users.add(
User.builder()
.login("log" + i)
.name("name" + i)
.pass("pass" + i)
.role(
(i % 2 == 0) ? User.Role.ADMIN : User.Role.USER
).build()
);
}
return users;
}
}