java - ArrayList 的 collect() 上的 java.lang.ClassCastException
问题描述
我正在尝试搜索 mongo 数据库以在以下字段之一中查找给定搜索词的用户:
@GetMapping(value = {"/classes/search/{term}"})
public String className (
@PathVariable(required = true, value = "term") String term
) throws Exception {
// Escape user input
final String filteredTerm = escapeUserInput(term);
// Match using Bson filter
ArrayList<Document> matchedClasses = new ArrayList<Document>();
for (String modName : DATABASE.listCollectionNames()) {
ArrayList<Document> filteredContents = new ArrayList<Document>();
try {
getCollection(modName).find(
Filters.or(
Filters.text(filteredTerm),
Filters.eq("count", Long.parseLong(filteredTerm))
)
).into(filteredContents);
} catch (NumberFormatException e) {
getCollection(modName).find(Filters.text(filteredTerm)).into(filteredContents);
}
// Add to final doc if match is found
if (filteredContents != null) {
matchedClasses.addAll(filteredContents);
}
}
return String.valueOf(matchedClasses
.stream()
.distinct()
.sorted()
.collect(Collectors.toList())
);
}
}
所做的只是检索mongogetCollection()
集合。
当传递任何与数据库中的内容成功匹配的搜索词时,我会ClassCastException
在第 140 行得到一个(.collect(Collectors.toList())
)
java.lang.ClassCastException: class org.bson.Document cannot be cast to class java.lang.Comparable (org.bson.Document is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
at java.base/java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:47) ~[na:na]
at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) ~[na:na]
at java.base/java.util.TimSort.sort(TimSort.java:220) ~[na:na]
at java.base/java.util.Arrays.sort(Arrays.java:1515) ~[na:na]
at java.base/java.util.ArrayList.sort(ArrayList.java:1750) ~[na:na]
at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:392) ~[na:na]
at java.base/java.util.stream.DistinctOps$1$2.end(DistinctOps.java:168) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
at com.api.main.Executer.className(Executer.java:140) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
<TRUNCATED>
我怀疑这与Filters.text
我所做的更改有关,这已开始导致此错误,但我不明白为什么以及从这里下一步会在哪里?
解决方案
matchedClasses
是一个ArrayList<Document>
并且Document
没有实现Comparable
。
运行时.collect(Collectors.toList())
,它还会尝试对Stream
元素进行排序,因为您调用了sorted
. 用于排序的 Bot,元素需要实现Comparable
或传递 a Comparator
to .sorted()
。
由于Document
是您无法控制的 MongoDB 类,您需要将 a 传递Compatator
给.sorted()
:
//...
.sorted((document1,document2)->/*compare documents here*/)
//...
推荐阅读
- dart - 在 Flutter 中实现 MQTT
- java - 如何使用 Java 从 XML 页面获取“presentationURL”?
- asp.net - Process.start() 在 iis 上不起作用
- mysql - ERROR 1064 (42000): You have an error in your SQL - when trying to insert a response json into my mysql
- java - 为什么有必要明确说 lambda 是 Consumer 以使用 andThen 方法?
- javascript - 从输入中突出显示多个内容 div 中的文本
- javascript - 设备令牌过期时,是否会自动从 FCM 设备组中删除?
- java - 我想要java正则表达式所有匹配的索引
- c# - C# WPF LiveChart 在动态创建的图表中更新数据系列
- mongodb - 从 mongo db 中相同结构的多个集合中获取数据