- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以这就是导致问题的问题......
我使用 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
没有加载实体类(User
和 News
)。
因此,经过大量研究......并引用了在 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
类加载器来覆盖它。
但是警告仍然不断出现。它不一定会破坏代码,因为类(User
和 News
)实际上已加载,并且我仍然可以正常地从中获取值。但我的日志中充斥着这些警告,也许我不仅仅因为知道应用程序的某些部分仍然因这些奇怪的警告而行为不当而感到舒服。
所以我需要的是这个问题的永久解决方案......以及为什么答案实际上解决了问题的具体解释。谢谢大家!
最佳答案
我在使用 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/
所以这就是导致问题的问题...... 我使用 MongoDB 数据库在 jBoss 上运行这个 javaEE 应用程序。我使用Morphia与mongo进行通信...该应用程序具有以下基本程序组件;
我是一名优秀的程序员,十分优秀!