MongoDB Java 驱动程序 ~ "Class contains generic types that have not been specialised." -错误在不包含泛型类型的类上



我遇到了以下错误,而试图从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()
);

相关内容

  • 没有找到相关文章

最新更新