Как работать с неизменяемым объектом в mongodb и lombook без @BsonDiscriminator - PullRequest
0 голосов
/ 07 февраля 2020

Я пытался работать с неизменяемыми объектами в 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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...