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
- 我想知道为什么
readByDocument
returns 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;
将不起作用。感谢您的帮助。
我正在尝试通过 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
- 我想知道为什么
readByDocument
returnsnull
谢谢。
---- 编辑
以下是我的数据库配置
@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;
将不起作用。感谢您的帮助。