【问题标题】:Spring data Mongo DB retrieving data : @Document VO returns nullSpring数据Mongo DB检索数据:@Document VO返回null
【发布时间】:2016-11-08 02:37:59
【问题描述】:

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

下面是用户VO的类

@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 方法返回正常,但 readByDocument 没有(返回 null 不是 User 实例)。我读了official document。但我没有得到任何线索。

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

  • 我想知道为什么readByDocument返回null

谢谢。

---- 编辑

Follow 是我的数据库配置

@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 实现。

【问题讨论】:

  • 能否添加spring配置文件?
  • 请注意,您拥有的 @Field 注释是完全多余的。
  • @chrylis @Field 可以做出不同的结果吗?我已经尝试过没有它,但没有任何改变(我将该注释用于我尚未进行的进一步处理)。无论如何谢谢。
  • @Veeram 编辑了帖子。添加了我的 mongo 配置

标签: java mongodb spring-mvc spring-data value-objects


【解决方案1】:

对于当前的解决方案

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

  • 用@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;

不会工作。感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多