Различные конвертеры для одного и того же объекта весной Data Mongo - PullRequest
0 голосов
/ 25 марта 2019

Как сохранить одно поле как строку в одной коллекции и как объект в другой коллекции

Мне нужно сохранить объект в mongoDB с двумя конвертерами.

class Comment {
    User user; //Store it into the database as a String userName;
    String commentText;
    //getters, setters
}

class User {
    String userName;
    // other fields.
    //  getters, setters
}

Это то, что мне нужно.Коллекция комментарий

{
    "_id" : "someValidObjectId_1",
    "commentText" : "ABC",
    // Plain String, not n object.
    "user" : "user1"
},
{
    "_id" : "someValidObjectId_2",
    "commentText" : "EFG",
    "user" : "user2"
}

Коллекция пользователь

{
    "_id" : "serId_1",
    "userName" : "user1",
    // other fields
},
{
    "_id" : "serId_2",
    "userName" : "user2",
    // other fields
}

Для этого я использую Spring Converter.

import org.springframework.core.convert.converter.Converter;

// instruct Mongo to store User as plain string instead of nested object
public final static class UserWriteConverter implements Converter<User, String> {

    @Override
    public String convert(final User user) {
        return user.getUserName();
    }
}

public static final class UserReadConverter implements Converter<String, User> {

    @Override
    public User convert(final String userString) {
        // Creates an new Object with all fields empty, except userName.
        return User.of(userString);
    }
}

Теперь моя проблема

Как сохранить пользователя со всеми полями в коллекции user и в виде строки вполевой пользователь Комментарий .

Обратите внимание, я не могу изменить

class Comment {
    // The type must be user!!!
    User user
}

Мои идеи решить эту проблему

Используйте другой класс, например

class Comment {
    UserName user;
}

Then add a converter to convert **UserName** into a String for **comment**.

Также я читаю ConditionalGenericConverter

Иногда требуется, чтобы преобразователь выполнялся только в том случае, если определенное условие выполняется.Например, вы можете захотеть выполнить конвертер только в том случае, если в целевом поле присутствует конкретная аннотация.Или вы можете захотеть выполнить Converter только в том случае, если в целевом классе определен определенный метод, такой как static valueOf.ConditionalGenericConverter - это подинтерфейс GenericConverter, который позволяет вам определять такие пользовательские критерии соответствия

...