如何解决这个Morphia映射问题??? --->警告[org.mongodb.morphia.mapping.DefaultCreator] - 在dbObj中未找到的类: [英] How to fix this Morphia mapping issue??? ---> WARNING [org.mongodb.morphia.mapping.DefaultCreator] - Class not found defined in dbObj:

查看:285
本文介绍了如何解决这个Morphia映射问题??? --->警告[org.mongodb.morphia.mapping.DefaultCreator] - 在dbObj中未找到的类:的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So here goes the problem leading to the question...

我使用MongoDB数据库在jBoss上运行这个javaEE应用程序。我使用Morphia与mongo进行通信...该应用程序具有以下基本程序组件;

I have this javaEE application running on jBoss using MongoDB database. I use Morphia to communicate with mongo... The application has the following basic program components;

@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配置如下所示;

And then my Morphia config looks as follows;

//Morphia Setup
morphia = new Morphia();
morphia.map(User.class).map(News.class);
...

然后我通过调用下面显示的方法进行查询;

Then I do a query by calling the method shown below;

public List<News> findByUID(Long uId){
    Query<News> query = getNewsQuery().field("active").equal(true).field("uid").equal(uId);
    return query.asList();
}

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

Fine! So far... no error. But I get a weird warning for each model (User and News). See StackTrace below:

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 未加载实体类(用户新闻)。

Now, I have found that this may have something to do with Morphia's class mapping... That org.mongodb.morphia.mapping.DefaultCreator is not loading the entity classes (User and News).

经过大量研究......并参考解决方案(他们说它有效),可在此处找到 https://code.google.com/p/morphia/issues/detail?id=208 ,我覆盖 org.mongodb.morphia.mapping.DefaultCreator 将以下内容添加到我的morphia配置中;

So after much research... and referencing the solution (they say it works) found here https://code.google.com/p/morphia/issues/detail?id=208, I override the org.mongodb.morphia.mapping.DefaultCreator by adding the following to my morphia config;

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 类加载器来覆盖它。

Note: that in the original solution, the overriden method was getClassLoaderForClass(String clazz, DBObject object) but in my case (due to my version of Morphia - 0.109 - which i believe is probably the most recent obtained from mongo official site), the method is getClassLoaderForClass(). So, I accordingly override it by returning my RootEntity class loader.

但警告仍在继续。它不一定会破坏代码,因为Classes( User News )实际上已加载,我仍然可以获取值通常来自他们。但是我的日志充满了这些警告,也许我不仅仅知道应用程序的某些部分仍然会对这些奇怪的警告行为不端。

But still the WARNING keeps coming. It doesn't necessarily break code because the Classes (User and News) actually get loaded and I can still grab values normally from them. But my logs get flooded with these warnings and perhaps I'm not just comfortable knowing that some part of the application still misbehaves with these strange warnings.

所以我需要的是这个问题的永久解决方案......以及为什么答案能够真正解决问题的具体解释。谢谢你们!

So what I need is a permanent solution to this problem... and a concrete explanation of why the answer actually solves the problem. Thanks y'all!

推荐答案

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

I had the same problem with a Play 2.4 application. For me, this worked:

// 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,但他们也有他们自己的类加载范例,您需要考虑这些范例。希望它有所帮助。

I don't know JavaEE very well, but they too have their own class loading paradigms which you need to take into consideration. Hope it helps.

这篇关于如何解决这个Morphia映射问题??? ---&GT;警告[org.mongodb.morphia.mapping.DefaultCreator] - 在dbObj中未找到的类:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆