2016-11-08 55 views
0

我試圖通過spring框架從mongodb檢索數據。 起初我發回的類型Map<String, Object>,但我決定改爲User值對象。Spring數據Mongo DB檢索數據:@Document VO返回null

下面是用戶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不(返回nullUser實例)。我讀了official document。但我沒有得到任何線索。

僅供參考,參數Query對於兩者來說都是相同的。 Query: { "id" : "system"}, Fields: null, Sort: null

  • 我想知道爲什麼readByDocument回報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實現。

+0

請問您可以添加spring配置文件嗎? – Veeram

+0

請注意,您擁有的'@ Field'註釋完全是多餘的。 – chrylis

+0

@chrylis'@ Field'可以做出不同的結果嗎?我已經嘗試過沒有它但沒有任何改變(我把這個註釋放到了我還沒有做的進一步過程中)。不管怎樣,謝謝。 –

回答

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; 

將無法​​正常工作。感謝幫助。