如何在java中清除ClassCastException? 公共列表查询(){ 列表时间范围=新建ArrayList(); Settings=Settings.settingsBuilder().put(“cluster.name”,“elasticsearch”).build(); Client Client=TransportClient.builder().settings(settings.build().addTransportAddress((TransportAddress)新的InetSocketTransportAddress(新的InetSocketAddress(“127.0.0.1”,9300)); SearchResponse sResponse=null; QueryBuilder qb=QueryBuilders.rangeQuery(“行号”)。从(100)到(200); while(sResponse==null | | sResponse.getHits().hits().length!=0){ int scrollSize=200,i=0; sResponse=client.prepareSearch(“jsonlogpage”) .setTypes(“jsonlog”) .setQuery(QueryBuilders.matchAllQuery()) .setSize(滚动大小) .setFrom(i*scrollSize) .execute() .actionGet(); for(SearchHit:sResponse.getHits()){ timeRange.add(hit);//add()显示错误 } i++; } 返回时间范围; }
我正在使用搜索响应。我在add()中出错 错误: 线程“main”java.lang.ClassCastException中的异常:org.elasticsearch.search.internal.InternalSearchHit无法转换为com.example.elasticsearch.LogLineEntry如何在java中清除ClassCastException? 公共列表查询(){ 列表时间范围=新建ArrayList(); Settings=Settings.settingsBuilder().put(“cluster.name”,“elasticsearch”).build(); Client Client=TransportClient.builder().settings(settings.build().addTransportAddress((TransportAddress)新的InetSocketTransportAddress(新的InetSocketAddress(“127.0.0.1”,9300)); SearchResponse sResponse=null; QueryBuilder qb=QueryBuilders.rangeQuery(“行号”)。从(100)到(200); while(sResponse==null | | sResponse.getHits().hits().length!=0){ int scrollSize=200,i=0; sResponse=client.prepareSearch(“jsonlogpage”) .setTypes(“jsonlog”) .setQuery(QueryBuilders.matchAllQuery()) .setSize(滚动大小) .setFrom(i*scrollSize) .execute() .actionGet(); for(SearchHit:sResponse.getHits()){ timeRange.add(hit);//add()显示错误 } i++; } 返回时间范围; },java,
elasticsearch,Java,
elasticsearch,我正在使用搜索响应。我在add()中出错 错误: 线程“main”java.lang.ClassCastException中的异常:org.elasticsearch.search.internal.InternalSearchHit无法转换为com.example.elasticsearch.LogLineEntry LogLineEntry是一个pojo类。我的列表是为LogLineEntry创建的,hit变量属于searchHit。所以我无法将searchHit变量添加到列表中。如何解决此
LogLineEntry是一个pojo类。我的列表是为LogLineEntry创建的,hit变量属于searchHit。所以我无法将searchHit变量添加到列表中。如何解决此问题?您需要将每个
SearchHit
转换为LogLineEntry
实例。您不能只将SearchHit
实例添加到声明包含LogLineEntry
实例的列表中
因此,在for循环中,您需要创建一个新的LogLineEntry
实例,并用在每个SearchHit
实例中找到的字段填充它
public List<LogLineEntry> query(){
List<LogLineEntry> timeRange = new ArrayList<LogLineEntry>();
Settings settings = Settings.settingsBuilder().put("cluster.name", "elasticsearch").build();
Client client = TransportClient.builder().settings(settings).build().addTransportAddress((TransportAddress) new InetSocketTransportAddress(new InetSocketAddress("127.0.0.1", 9300)));
SearchResponse sResponse = null;
QueryBuilder qb = QueryBuilders.rangeQuery("lineNumber").from(100).to(200);
while(sResponse== null|| sResponse.getHits().hits().length != 0){
int scrollSize=200, i=0;
sResponse = client.prepareSearch("jsonlogpage")
.setTypes("jsonlog")
.setQuery(QueryBuilders.matchAllQuery())
.setSize(scrollSize)
.setFrom(i * scrollSize)
.execute()
.actionGet();
for(SearchHit hit : sResponse.getHits()){
timeRange.add(hit); //add() shows error
}
i++;
}
return timeRange;
}
您需要将每个SearchHit
转换为LogLineEntry
实例。您不能只将SearchHit
实例添加到声明包含LogLineEntry
实例的列表中
因此,在for循环中,您需要创建一个新的LogLineEntry
实例,并用在每个SearchHit
实例中找到的字段填充它
public List<LogLineEntry> query(){
List<LogLineEntry> timeRange = new ArrayList<LogLineEntry>();
Settings settings = Settings.settingsBuilder().put("cluster.name", "elasticsearch").build();
Client client = TransportClient.builder().settings(settings).build().addTransportAddress((TransportAddress) new InetSocketTransportAddress(new InetSocketAddress("127.0.0.1", 9300)));
SearchResponse sResponse = null;
QueryBuilder qb = QueryBuilders.rangeQuery("lineNumber").from(100).to(200);
while(sResponse== null|| sResponse.getHits().hits().length != 0){
int scrollSize=200, i=0;
sResponse = client.prepareSearch("jsonlogpage")
.setTypes("jsonlog")
.setQuery(QueryBuilders.matchAllQuery())
.setSize(scrollSize)
.setFrom(i * scrollSize)
.execute()
.actionGet();
for(SearchHit hit : sResponse.getHits()){
timeRange.add(hit); //add() shows error
}
i++;
}
return timeRange;
}
从hit中需要的任何值从hit变量中获取,并在for循环内创建新的LogLineEntry
,将该值设置为LnLineEntry对象,然后将该对象添加到列表中,从hit中需要的任何值从hit变量中获取,并在for循环内创建新的LogLineEntry
,并将该值设置为当我创建entry.setXyz(hit.getXyz())时,LnLineEntry对象将该对象添加到listThank you Val中;错误显示将强制转换添加到命中条目。setLineNumber(((LogLineEntry)hit.getLineNumber());这是否正确?否,entry.setLineNumber(hit.getSource().get(“lineNumber”))
setLineNumber数据类型很长。它显示了错误。。我可以使用entry.setLineNumber((长)hit.getSource().get(“lineNumber”));或者我应该在pojo类中将long改为Object吗?我很抱歉打扰你。现在还有一个错误,线程“main”java.lang.ClassCastException中的异常:java.lang.Integer不能转换为java.lang.Long,我没有int变量。我强烈建议您在深入研究更复杂的内容之前,先参加一个简短的java速成课程,学习语言基础知识:-)在创建entry.setXyz(hit.getXyz())时谢谢您Val;错误显示将强制转换添加到命中条目。setLineNumber(((LogLineEntry)hit.getLineNumber());这是否正确?否,entry.setLineNumber(hit.getSource().get(“lineNumber”))
setLineNumber数据类型很长。它显示了错误。。我可以使用entry.setLineNumber((长)hit.getSource().get(“lineNumber”));或者我应该在pojo类中将long改为Object吗?我很抱歉打扰你。现在还有一个错误,线程“main”java.lang.ClassCastException中的异常:java.lang.Integer不能转换为java.lang.Long,我没有int变量。我强烈建议您在深入研究更复杂的内容之前,先参加一个简短的java速成课程,学习语言基础知识:-)