java - 如何解决这个 Morphia 映射问题??? ---> 警告 [org.mongodb.morphia.mapping.DefaultCreator] - 未在 dbObj : 中找到定义的类

标签 java mongodb morphia

所以这就是导致问题的问题......

我使用 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();
}

好吧!到目前为止...没有错误。但我收到每个模型(用户和新闻)的奇怪警告。请参阅下面的 StackTrace:

WARNING [org.mongodb.morphia.mapping.DefaultCreator] (http-localhost-127.0.0.1-8080-3) Class not found defined in dbObj: : 
java.lang.ClassNotFoundException: com.package.models.News from [Module "deployment.Wealth.war:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
at java.lang.Class.forName0(Native Method) [rt.jar:1.7.0_45]
at java.lang.Class.forName(Unknown Source) [rt.jar:1.7.0_45]
at org.mongodb.morphia.mapping.DefaultCreator.getClass(DefaultCreator.java:89) [morphia-0.109.jar:]
at org.mongodb.morphia.mapping.DefaultCreator.createInstance(DefaultCreator.java:37) [morphia-0.109.jar:]
at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:298) [morphia-0.109.jar:]
at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:79) [morphia-0.109.jar:]
at org.mongodb.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:65) [morphia-0.109.jar:]
at org.mongodb.morphia.query.MorphiaIterator.next(MorphiaIterator.java:60) [morphia-0.109.jar:]
at org.mongodb.morphia.query.QueryImpl.asList(QueryImpl.java:312) [morphia-0.109.jar:]
at ng.wealth.business.NewsBean.findByActive(NewsBean.java:99) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_45]
at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.7.0_45]
...(*the rest omitted for brevity*)...

现在,我发现这可能与 Morphia 的类映射有关... org.mongodb.morphia.mapping.DefaultCreator 没有加载实体类(UserNews)。

因此,经过大量研究......并引用了在 https://code.google.com/p/morphia/issues/detail?id=208 找到的解决方案(他们说它有效),我通过将以下内容添加到我的 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 类加载器来覆盖它。

但是警告仍然不断出现。它不一定会破坏代码,因为类(UserNews)实际上已加载,并且我仍然可以正常地从中获取值。但我的日志中充斥着这些警告,也许我不仅仅因为知道应用程序的某些部分仍然因这些奇怪的警告而行为不当而感到舒服。

所以我需要的是这个问题的永久解决方案......以及为什么答案实际上解决了问题的具体解释。谢谢大家!

最佳答案

我在使用 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,但他们也有their own class loading paradigms你需要考虑到这一点。希望对您有所帮助。

关于java - 如何解决这个 Morphia 映射问题??? ---> 警告 [org.mongodb.morphia.mapping.DefaultCreator] - 未在 dbObj : 中找到定义的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27939445/

相关文章:

java - 如何声明一个方法引用数组?

java - "Could not find or load main class"是什么意思?

java - 使用 OAuth2 以编程方式向 Google 进行身份验证

mongodb - 使用复合键调用 ensureIndex 会导致索引对象中的 _id 字段

java - 没有灰色区域的可滚动 JPanel

node.js - 为什么 MongoDB/Mongoose 查找带有 null 或未定义参数的查询会返回所有文档?

node.js - MongoDB mLab mongoose Node.js 驱动程序 - 一段空闲时间后连接超时?

node.js - 为什么此查询可以在 mongo shell 中运行,但不能在 Node mongo 驱动程序中运行?

java - Morphia - 更改与集合关联的类

java - 没有 map 的吗啡使用的类