基于morphia的java多态反序列化
我有一个属性为嵌套列表的java对象。比如:
@Entity(value="Users", noClassnameStored = true )
public class User implements IUser
{
@Id
private ObjectId id;
private String userName;
private String email;
@Embedded
private List<ITeam> anyTeams;
@Embedded
private List<Role> roles;
@Embedded
private List<ITask> anyTasks;
@Embedded
private List<IUserStory> userStories;
}
它可以被解析为MongoDB,而使用Morphia进行映射没有问题。然而,当我创建查询时
Query<User> query = datastore.createQuery(User.class);
List<User> users = query.asList();
它引发了一个例外
Exception in thread "main" java.lang.RuntimeException: org.mongodb.morphia.mapping.MappingException: No usable constructor for interfaces.ITeam
at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:76)
at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:846)
at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:282)
at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:193)
at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:134)
at org.mongodb.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:146)
at org.mongodb.morphia.query.MorphiaIterator.next(MorphiaIterator.java:117)
at org.mongodb.morphia.query.QueryImpl.asList(QueryImpl.java:147)
at org.mongodb.morphia.query.QueryImpl.asList(QueryImpl.java:139)
at controllers.DBConnection.TestMongo(DBConnection.java:120)
at Main.main(Main.java:12)
Caused by: org.mongodb.morphia.mapping.MappingException: No usable constructor for interfaces.ITeam
at org.mongodb.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:81)
at org.mongodb.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:91)
at org.mongodb.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:105)
at org.mongodb.morphia.mapping.EmbeddedMapper.readMapOrCollectionOrEntity(EmbeddedMapper.java:209)
at org.mongodb.morphia.mapping.EmbeddedMapper.readCollection(EmbeddedMapper.java:144)
at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:47)
... 10 more
Caused by: org.mongodb.morphia.mapping.MappingException: No usable constructor for interfaces.ITeam
at org.mongodb.morphia.mapping.DefaultCreator.getNoArgsConstructor(DefaultCreator.java:53)
at org.mongodb.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:72)
... 15 more
Caused by: java.lang.NoSuchMethodException: interfaces.ITeam.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getDeclaredConstructor(Class.java:2178)
at org.mongodb.morphia.mapping.DefaultCreator.getNoArgsConstructor(DefaultCreator.java:49)
... 16 more
据我所知,Morphia抱怨无法将Bson对象映射到嵌入式接口属性。我曾尝试在接口之外添加具体对象的列表,但没有成功,引发了相同的异常。我怎样才能克服这个问题
更新:下面是我的ITeam接口及其由班级团队实现的情况
public interface ITeam {
public String getId();
public void setName(String name);
public String getName();
public void addUser(IUser user);
public void removeUser(IUser user);
public List<IUser> getAllTeamMates();
public void removeManyTeamMates(List<IUser> userList);
public void updateUsers(List<IUser> users);
public List<IProject> getAllProjects();
public void assignProject(IProject project);
public void delegateTeamLeader(IUser user);
public void deleteTeam();
}
@Entity(value="Teams", noClassnameStored = true )
public class Team implements ITeam {
@Id
private String id;
private String name;
private IUser teamLeader;
private List<IUser> teamMates;
private List<IProject> projects;
public GeneralTeam() {
}
public GeneralTeam(String teamName) {
setName(teamName);
}
//...other properties;
//...overriding methodes etc
}
谢谢
共 (0) 个答案