So here goes the problem leading to the question...
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 {
...
}
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();
}
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*)...
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
).
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();
}
};
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.
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!