Spring Data Mongo中针对同一对象的不同转换器

时间:2019-03-25 17:45:43

标签: java mongodb spring-data-mongodb

如何将一个字段作为字符串存储在一个集合中,并作为对象存储在另一个集合中

我需要使用两个转换器将对象存储到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 Converters。

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 中,并作为字符串存储到 Comment 的字段用户中。

注意,我不能更改

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。例如,如果目标字段上存在特定的注释,则可能只想执行Converter。或者,您可能只想在目标类上定义了特定方法(例如静态valueOf方法)的情况下执行Converter。 ConditionalGenericConverter是GenericConverter的子接口,可让您定义此类自定义匹配条件

0 个答案:

没有答案