Spring 数据 Mongo DB 检索数据:@Document VO returns null

Spring data Mongo DB retrieving data : @Document VO returns null

我正在尝试通过 spring 框架从 mongodb 检索数据。 一开始我做了return类型Map<String, Object>,但是我决定改成User值对象

下面是用户VO

的class
@Document(collection = "user")
public class User {

    @Id
    @Field(value="id")
    private String id;

    @Field(value="name")
    private String name;

    @Field(value="password")
    private String password;

    @Field(value="professional")
    private String professional;

    @Field(value="email")
    private String email;

    @Field(value="gravatar")
    private String gravatar;

    @PersistenceConstructor
    public User(String id, String name, String password, String professional, String email, String gravatar) {
        super();
        this.id = id;
        this.name = name;
        this.password = password;
        this.professional = professional;
        this.email = email;
        this.gravatar = gravatar;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getProfessional() {
        return professional;
    }

    public void setProfessional(String professional) {
        this.professional = professional;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGravatar() {
        return gravatar;
    }

    public void setGravatar(String gravatar) {
        this.gravatar = gravatar;
    }
};

这是@repository检索数据

@Repository
public class MongoMemberDao implements CommonDao<String, Map<String, Object>, Exception> {

    @Autowired
    MongoTemplate template;

    final String COLLECTION_NAME = "user";

    @SuppressWarnings("unchecked")
    @Override
    public Map<String, Object> read(String key) throws Exception {
        Query findQuery = new Query();
        findQuery.addCriteria(Criteria.where("id").is(key));
        return template.findOne(findQuery, Map.class, COLLECTION_NAME);
    }

    public User readByDocument(String id) throws Exception {
        Query findOneQuery = new Query();
        findOneQuery.addCriteria(Criteria.where("id").is(id));
        return template.findOne(findOneQuery, User.class, COLLECTION_NAME);
    }
};

read 方法 return 很好,但 readByDocument 不行(return 是 null 不是 User 实例)。我读 official document。但是我没有得到任何线索。

仅供参考,两者的参数 Query 看起来相同。 Query: { "id" : "system"}, Fields: null, Sort: null

谢谢。

---- 编辑

以下是我的数据库配置

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {
    private final String MONGO_URL = "127.0.0.1";
    private final Integer MONGO_PORT = 27017;

    @Override
    protected String getDatabaseName() {
        return "tfarm";
    }

    @Override
//  @Bean
    public Mongo mongo() throws Exception {
        return new MongoClient(MONGO_URL, MONGO_PORT);
    }
}

然后我将其添加到 WebApplictaionInitializer 工具中。

对于当前解决方案

我在官方网站上找到了关注

  • 用@Id 注释的字段 (org.springframework.data.annotation.Id) 将映射到 _id 字段。
  • 没有注释但命名为id的字段将被映射到_id 字段。
  • 标识符的默认字段名称是_id,可以自定义 通过@Field 注释。

所以我改变了我的 VO 就像...

@Document(collection = "user")
public class User {

    @Id
    private ObjectId _id;

    @Field(value="id")
    private String id;

    @Field(value="name")
    private String name;

    @Field(value="password")
    private String password;

    @Field(value="professional")
    private String professional;

    @Field(value="email")
    private String email;

    @Field(value="gravatar")
    private String gravatar;

    @PersistenceConstructor
    public User(String id, String name, String password, String professional, String email, String gravatar) {
        super();
        this.id = id;
        this.name = name;
        this.password = password;
        this.professional = professional;
        this.email = email;
        this.gravatar = gravatar;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public ObjectId get_id() {
        return _id;
    }

    public void set_id(ObjectId _id) {
        this._id = _id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getProfessional() {
        return professional;
    }

    public void setProfessional(String professional) {
        this.professional = professional;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGravatar() {
        return gravatar;
    }

    public void setGravatar(String gravatar) {
        this.gravatar = gravatar;
    }
};

已添加 ObjectId。或者,只需删除 @Id 注释也可以。然而

@Id
@Field(value="id")
String id;

将不起作用。感谢您的帮助。