我遇到了以下错误,而试图从MongoDB集合在Java中读取对象列表,同时应用过滤器:
Encoding a Class: '...DefaultDiscussionThreadConfiguration' failed with the following exception:
Class contains generic types that have not been specialised.
Top level classes with generic types are not supported by the PojoCodec.
奇怪的是:被引用的类不包含泛型类型,并且实际上不应该存在于发生错误的上下文中。下面是这个类的样子:
public class DefaultDiscussionThreadConfiguration extends DiscussionThreadConfiguration {
@Override
@BsonIgnore
public DiscussionThreadConfigurationType getDiscussionThreadConfigurationType() {
return DiscussionThreadConfigurationType.DEFAULT;
}
@Override
public DefaultDiscussionThreadConfigurationNetworkData toDiscussionThreadConfigurationNetworkData() {
return new DefaultDiscussionThreadConfigurationNetworkData();
}
}
甚至扩展类也不包含泛型类型。
@BsonDiscriminator
public abstract class DiscussionThreadConfiguration {
public abstract DiscussionThreadConfigurationType getDiscussionThreadConfigurationType();
public abstract DiscussionThreadConfigurationNetworkData toDiscussionThreadConfigurationNetworkData();
}
一点背景:我要做的是获得所有默认类型讨论线程数据库对象的列表。它们看起来像这样:
DiscussionThreadDbData
├discussionThreadConfiguration
└[other fields]
同时,DiscussionThreadConfiguration
是一个决定线程类型的字段,也保存特定类型的数据。它的继承结构是这样的:
DiscussionThreadConfiguration (abstract)
├DefaultDiscussionThreadConfiguration
└PrdDiscussionThreadConfiguration (abstract)
├PrdDiscussionThreadGlobalConfiguration
└PrdDiscussionThreadInternalConfiguration
现在,至于为什么我说DefaultDiscussionThreadConfiguration
甚至不应该存在于该上下文中:
这发生在我添加讨论PrdDiscussionThreadGlobalConfiguration
的测试过程中,然后运行一个应该只返回默认线程的查询,并期望有0个线程返回。当我在测试崩溃之前暂停测试并检查数据库时,我可以看到其中有一个线程,看起来像这样:
discussion_thread[0]
├discussionThreadConfiguration
│├_t:...PrdDiscussionThreadGlobalConfiguration
│└[other fields]
└[other fields]
正确。现在我在上面运行的过滤器是:
Filters.eq(
discussionThreadConfiguration._t,
DefaultDiscussionThreadConfiguration.class
);
但由于某些原因,这不起作用。
实际的错误消息有些误导。发生这种情况的原因是,您试图向过滤器传递一个类而不是字符串,这会导致奇怪的行为。
过滤器实际上应该是这样的:
Filters.eq(
discussionThreadConfiguration._t,
DefaultDiscussionThreadConfiguration.class.getName()
);