引自免费微信小程序:皆我百晓生
在整合easy-es后,当调接口时出现报错,错误信息为no such method:,这通常表明在调用特定方法时,所引用的方法在目标类(此处为MyEasyEsService)中不存在或已经被移除。在这种情况下,解决这个问题可以分为以下步骤:
- 检查是否已移除
easy_es依赖项:
dependencies {
implementation 'org.elasticsearch:elasticsearch:7.x'
implementation 'org.elasticsearch:easy-es-client:7.x'
}
- 确认是否已经引入
LambdaEsQueryWrapper用于ES查询并使用Lambda扩展器(lambdaEsQueryWrapper)
- 首先,在
MyEasyEsService的源代码中,确保使用以下依赖注入链加载LambdaEsQueryWrapper:
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
@Autowired
private RestHighLevelClient restHighLevelClient;
public MyEasyEsService() {
restHighLevelClient.setTransport(new HttpSettingsBuilder()
.setHost("localhost")
.setPort(9200)
.build());
}
// 使用`LambdaEsQueryWrapper`创建`LambdaEsQueryWrapper`对象并设置其相关参数
private LambdaEsQueryWrapper lambdaEsIndexWrapper = new LambdaEsQueryWrapper<>();
lambdaEsIndexWrapper.eq( column: "song_title", val: "锦鲤抄");
List yinLins = myEsMapper.selectList(lambdaEsIndexWrapper);
- 检查
MyEsMapper中的查询方法是否存在:
- 查看
MyEsMapper中的所有查询方法,确保其中包含LambdaEsQueryWrapper并实现了eq操作符。这个方法应接收一个字典(key为字段名称、value为查询条件)作为参数,并返回符合条件的结果集合。
public List selectList(LambdaEsQueryWrapper query) {
return myEsMapper.select(query);
}
- 检查
myEsMapper中的对应方法是否有Id参数:
- 如果
MyEsMapper中的某个查询方法需要Id参数,检查对应的类定义。如果在这个类中没有实现Id方法,你需要将Id参数替换为一个默认值或设置为可选参数。例如,如果查询中有一个名为album_id的字段,并且需要一个Id值进行索引:
public void setId(String id) {
if (id == null || id.isEmpty()) {
throw new IllegalArgumentException("ID cannot be empty or null");
}
myEsMapper.setId(id);
}
- 更新
MyEasyEsService的构造函数:
- 更新
MyEasyEsService的构造函数以接受包含上述所需更改的方法和参数的ELasticSEARCH配置。修改后的构造函数示例如下:
@Service
public class MyEasyEsService implements EasyEsService {
private final MyEsMapper myEsMapper;
public MyEasyEsService(MyEsMapper esMapper) {
this.myEsMapper = esMapper;
}
// 添加或更新查询方法
// ...
}
- 更新项目配置文件中的Elasticsearch配置:
- 在项目的
application.yml文件中添加以下内容,以指定MyEasyEsService的相关 Elasticsearch 配置:
# application.yml
easy_es:
client:
transport:
http:
host: localhost
port: 9200
json:
schema_version: 6
hosts: ["localhost"]
default_params:
index:
name: yin_lin
number_of_shards: 1
replicas: 1
type: search
- 在
application.yml文件中设置default_params选项,它包含了 Elasticsearch 中默认的节点配置,包括index(索引名称)、number_of_shards(节点数量)、replicas(副本数)和type(类型)。
-
测试MyEasyEsService是否按预期工作:
- 创建一个简单的数据集(例如,一个包含
YinLin文档的集合),然后使用GET /yin_lin或类似的URL发送一个查询请求。确保正确调用了MyEasyEsService的select方法,获取到满足查询条件的结果列表。
MyEasyEsService myEsService = new MyEasyEsService(new MyEsMapper());
List yinLins = myEsService.getEsYinLinX();
// 列表测试
for (YinLin yinLin : yinLins) {
System.out.println(yinLin.getName());
}
-
运行MyEasyEsService以验证结果:
- 将以上修改后的代码片段整合到
main方法或类方法中,启动你的应用服务器(如Spring Boot 或者 Spring Cloud Eureka),然后访问指定的索引路径,查看搜索结果是否按预期工作。
以上步骤应该可以帮助您解决整合easy-es后出现的no such method:错误,并使调用MyEasyEsService的接口返回预期结果。如果您有任何具体的问题或遇到困难,欢迎随时向我提问,我会尽力提供更详细的指导。在此过程中,如果你需要绘制图形辅助理解,你可以通过添加相应的图例和箭头表示查询和映射关系,代码实现中的状态变迁也支持使用线条和符号辅助描述。