【发布时间】:2014-01-31 00:46:22
【问题描述】:
我在 Mongo 中有一个用户集合:
{
"_id" : "user1",
"_class" : "edu.asu.spring.herckules.domain.impl.User",
"password" : "99fd6396-a9a3-4c7d-8c1e-f834d99bdc9e",
}
{
"_id" : "user2",
"_class" : "edu.asu.spring.herckules.domain.impl.User",
"password" : "075d743d-32ee-4193-bb6f-0e827bebc34e",
}
只有getter和setter对应的java类和接口:
public class User implements IUser{
@Id
private String username;
private String password;
@Override
public String getUsername() {
return username;
}
@Override
public void setUsername(String username) {
this.username = username;
}
@Override
public String getPassword() {
return password;
}
@Override
public void setPassword(String password) {
this.password = password;
}
}
@Document(collection = "user")
public interface IUser {
public abstract void setUsername(String username);
public abstract String getPassword();
public abstract void setPassword(String password);
public abstract String getUsername();
}
例如,假设我正在尝试根据用户 ID 列表查找用户对象列表。
@Autowired
private MongoTemplate mongoTemplate;
//Inside method
List<String> useridList = new ArrayList<String>();
useridList.add("user1");
useridList.add("user2");
Query query = Query.query(Criteria.where("username").in(useridList));
List<IUser> usersList = mongoTemplate.find(query, IUser.class);
我收到以下异常:
java.lang.IllegalArgumentException: No property username found on edu.asu.spring.herckules.domain.IUser!
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:199)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.getPath(QueryMapper.java:560)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.<init>(QueryMapper.java:486)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:104)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1489)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1480)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:527)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:518)
我尝试按照here 的建议使用@TypeAlias,但这并没有解决我的问题。有没有办法在查找查询中使用接口?
谢谢大家。
【问题讨论】:
-
只是让您知道...您的接口中的方法默认为抽象,并且您没有为接口中的每个方法指定抽象。
-
我认为你 @Document(collection = "user") 应该在 POJO 类中声明,这是你的用户类,而不是在你的界面中。而且您必须更改 find 方法中的代码以映射到 User.class
-
我知道在 User 类上使用 Document 注释是可行的。我的问题是,有没有一种方法可以使用带有 Document 注释的接口并在 find 方法中使用相同的接口?
-
如果我理解正确,您的界面将有方法,您的 POJO 将有字段,这些字段将映射到您的 mongo 文档中的字段。当您使用 Find 进行查询时,您正在将数据从 Mongo 文档映射到您的 POJO 类...我对您为什么或如何将数据映射到接口中的方法感到困惑?