有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

基于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) 个答案