Java 如何修复此变形映射问题---&燃气轮机;警告[org.mongodb.morphia.mapping.DefaultCreator]-未在dbObj中找到定义的类:

Java 如何修复此变形映射问题---&燃气轮机;警告[org.mongodb.morphia.mapping.DefaultCreator]-未在dbObj中找到定义的类:,java,mongodb,morphia,Java,Mongodb,Morphia,这就是问题的症结所在 我使用MongoDB数据库在jBoss上运行这个javaEE应用程序。我用Morphia和mongo交流。。。该应用程序具有以下基本程序组件: @EntityListeners(RootEntityListener.class) public class RootEntity { @Id protected ObjectId id; @Indexed protected Long uid; @Indexed protected

这就是问题的症结所在

我使用MongoDB数据库在jBoss上运行这个javaEE应用程序。我用Morphia和mongo交流。。。该应用程序具有以下基本程序组件:

@EntityListeners(RootEntityListener.class)
public class RootEntity {
    @Id
    protected ObjectId id;
    @Indexed
    protected Long uid;
    @Indexed
    protected boolean active;
    ...
}

@Entity
public class User extends RootEntity {
    ...
}

@Entity
public class News extends RootEntity {
    ...
}
然后我的Morphia配置如下所示

//Morphia Setup
morphia = new Morphia();
morphia.map(User.class).map(News.class);
...
然后我通过调用如下所示的方法进行查询

public List<News> findByUID(Long uId){
    Query<News> query = getNewsQuery().field("active").equal(true).field("uid").equal(uId);
    return query.asList();
}
现在,我发现这可能与Morphia的类映射有关。。。
org.mongodb.morphia.mapping.DefaultCreator
没有加载实体类(
User
News

所以经过大量的研究。。。参考这里找到的解决方案(他们说它有效),我通过在我的morphia配置中添加以下内容来覆盖
org.mongodb.morphia.mapping.DefaultCreator

morphia.getMapper().getOptions().objectFactory = new DefaultCreator() {
    @Override
    protected ClassLoader getClassLoaderForClass() {
        return RootEntity.class.getClassLoader();
    }
};
注意:在最初的解决方案中,覆盖的方法是
getClassLoaderForClass(String clazz,DBObject object对象)
,但在我的情况下(由于我的Morphia-0.109版本,我相信这可能是从mongo官方网站获得的最新版本),方法是
getClassLoaderForClass()
。因此,我相应地通过返回
RootEntity
类加载器来覆盖它

但警告仍在继续。它不一定会破坏代码,因为类(
User
News
)实际上已经加载,我仍然可以正常地从它们那里获取值。但是,我的日志中充斥着这些警告,也许我不喜欢知道应用程序的某些部分仍然在这些奇怪的警告下行为不端


所以我需要的是这个问题的永久解决方案。。。并具体解释了为什么答案能解决问题。谢谢大家

我认为需要
@Id
注释。简单的解决方法是添加
@Id-protectedobjectid
。或者您确保您的
uid
是唯一的,然后您可以使用
@Id保护的长uid
(已编制索引,因此
@index
不再需要)


PS:由于基数太低,所以不确定是否值得为布尔值建立索引。对于你的查询,无论如何你都需要一个复合索引。

我今天早上才看到这篇文章(来自你的另一篇文章),所以首先,我对此表示歉意。(mongodb用户列表对我来说更具可见性,但我会尽可能在这里进行监视和响应。)我刚刚在Morphia的
master
分支上运行了您的测试用例,没有发现任何奇怪的错误。(
master
只是1.0.1之外的几次提交。)如果您还没有太多地转向纯驱动程序解决方案,我建议并确保迁移是必要的。

我在Play 2.4应用程序中也遇到了同样的问题。对我来说,这很有效:

// Overwrite objectFactorys ClassLoader Method to use Plays ClassLoader
// This prevents the log from beeing spammed with Warning-Messages about ClassNotFoundExceptions happening in Morphias objectFactory
morphia.getMapper().getOptions().setObjectFactory(new DefaultCreator() {
    @Override
    protected ClassLoader getClassLoaderForClass() {
        if(Play.maybeApplication().isDefined()) {
            return Play.classloader(Play.maybeApplication().get());
        } else {
            return PersistedObject.class.getClassLoader();
        }
    }
});

我对JavaEE不太了解,但它们也有一些需要考虑的地方。希望有帮助。

谢谢你指出我的错误。对不起,那是个打字错误。我已经编辑了代码,使其看起来与我的项目中的代码完全相同。。。在这个问题上仍然没有运气
uid
是一个简单的变量,它是为一个简单的目的而保存的,因此不需要
@id
它。需要指出的是,我之前也在RootEntity中执行了
@Id protected ObjectId
,然后将其移动到
新闻
&
用户
,警告仍然没有停止。。。还有其他想法吗?还是不走运,有人想帮忙吗???java版本?java 1.7 | jre7 | JBoss AS7你能检查一下整个版本吗。为什么,因为我在1.7.010中遇到了一个问题,在这个问题中,类加载器不能为morphia正常工作。因此,我切换到1.7.080。效果很好。您能检查一下并让我知道吗?是的,
@Id
是绝对必需的。:)好啊我有另一个分支上的morphia解决方案。我来试试1.0.1。谢谢,我只是试了一下,还是收到了同样的警告。即使使用morphia1.0.1。。。如果我可以问,morphia需要proxytoys和cglib nodep依赖项做什么?。。。我没有将它们添加到我对morphia的JBoss模块依赖项中,因为我认为它们都是可选的。这可能是问题所在吗?这些是惰性引用所需要的。如果不使用惰性引用,则不需要它们。奇怪的是,我不在的时候你却在看他们。我想知道是否有一些类加载器奇怪,因为jboss在混合…谢谢。我在Play 2.5+Morphia中遇到了同样的问题,你的解决方案帮了我很多!
// Overwrite objectFactorys ClassLoader Method to use Plays ClassLoader
// This prevents the log from beeing spammed with Warning-Messages about ClassNotFoundExceptions happening in Morphias objectFactory
morphia.getMapper().getOptions().setObjectFactory(new DefaultCreator() {
    @Override
    protected ClassLoader getClassLoaderForClass() {
        if(Play.maybeApplication().isDefined()) {
            return Play.classloader(Play.maybeApplication().get());
        } else {
            return PersistedObject.class.getClassLoader();
        }
    }
});