es资源库继承ElasticSearchRepository调用封装的API时总是抛出org.apache.ibatis.binding.BindingException: Invalid bound statement (not found),mybatis异常,Google了一下也总是找不到重点,结果都是和xml映射文件不匹配,方法名称不一致等有关mybatis问题。

于是乎就一步步追踪源码,es资源库层层继承,里面都封装了可供操作的API

@Component
public interface BookRepository extends ElasticsearchRepository<Book,String> {}

@NoRepositoryBean
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID>{
    <S extends T> S index(S entity);
    .......
}

@NoRepositoryBean
public interface ElasticsearchCrudRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>{}

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    Iterable<T> findAll(Sort var1);
    Page<T> findAll(Pageable var1);
}

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);
    .......
}

最终进AbstractElasticsearchRepository抽象类找到了我要调用的save()API,AbstractElasticsearchRepository实现了ElasticSearchRepository接口,是所有es提供的API的方法实现类
在这里插入图片描述
在此处我打了断点,但是很明显断点的显示不太对,debug走起时果然没有进来
在这里插入图片描述
断点进不了源码,可能是es资源库没有被注入,所以当调用save()API时,没有被识别为esRepository,才会报mybatis异常

springboot怎么把ElasticsearchRepository注入进来呢?求助万能的google终于找到答案,只需在启动类中添加一个注解即可,basePackages是es资源库所在包

@EnableElasticsearchRepositories(basePackages = "com.jdy2018.shop.entity.dao.mdc.es")

困扰了好几天,付出几根白头发的代价终于解决了

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐