nebula-contrib / ngbatis

NGBATIS is a database ORM framework base NebulaGraph + spring-boot, which takes advantage of the mybatis’ fashion development, including some de-factor operations in single table and vertex-edge, like mybatis-plus. NGBATIS 是一款针对 NebulaGraph + Springboot 的数据库 ORM 框架。借鉴于 MyBatis 的使用习惯进行开发。https://graph-cn.github.io/ngbatis-docs/
https://nebula-contrib.github.io/ngbatis/
Apache License 2.0
130 stars 42 forks source link

failed to start: `'cup.biz.kg.dao.TagBasicMapper' that could not be found.` #155

Closed zhangxk-ocean closed 5 months ago

zhangxk-ocean commented 1 year ago
  1. 报错信息: Description: Parameter 0 of constructor in cup.biz.kg.service.impl.TestServiceImpl required a bean of type 'cup.biz.kg.dao.TagBasicMapper' that could not be found. Action: Consider defining a bean of type 'cup.biz.kg.dao.TagBasicMapper' in your configuration.

2.配置信息 image image image image

zhangxk-ocean commented 1 year ago

ServiceImpl类: image

CorvusYe commented 1 year ago

导致这个问题的可能有两个原因 1 xml需要放在resources下 2 springboot启动位置没有加包扫描

zhangxk-ocean commented 1 year ago

我实在application配置中将xml文件位置换了,然后启动位置也加包扫描了呀,在另一个项目中这么做的,启动正常

CorvusYe commented 1 year ago

刚刚没注意看图了,不好意思哈 看下 xml 里面的 namesapce 是不是指向了对应的mapper.java

zhangxk-ocean commented 1 year ago

image xml文件里面是写了一个createTag语句,指向了mapper.java

CorvusYe commented 1 year ago

项目根目录有 asm-debug 的目录生成吗

zhangxk-ocean commented 1 year ago

没有

CorvusYe commented 1 year ago

在这个地方断点看下这个报错的 mapper 的信息, loadClassCode(classModelEntry);

zhangxk-ocean commented 1 year ago

image 应该是没走到这

CorvusYe commented 1 year ago

那往上一行断点,按理开始读取 bean 了,这步已经走完了,那最大的可能是 这个 map 是空的,还是扫描的位置出了问题

CorvusYe commented 1 year ago

或者在这个位置端点,直接看扫描得到了哪些内容:https://github.com/nebula-contrib/ngbatis/blob/8b6b9d5d3d52a3ce5359a8165d947f2610185f10/src/main/java/org/nebula/contrib/ngbatis/io/MapperResourceLoader.java#L78

zhangxk-ocean commented 1 year ago

有点奇怪,直接就结束了

CorvusYe commented 1 year ago

啊啊啊... 那只能直接断点在入口了https://github.com/nebula-contrib/ngbatis/blob/8b6b9d5d3d52a3ce5359a8165d947f2610185f10/src/main/java/org/nebula/contrib/ngbatis/NgbatisContextInitializer.java#L28

springboot是什么版本

zhangxk-ocean commented 1 year ago

没看版本 断点在入口就行了,要看什么呢 image

zhangxk-ocean commented 1 year ago

类没有被加载,这就是类没被扫描到吧,Application里的问题

CorvusYe commented 1 year ago

会不会跟这个问题是一样的 https://github.com/nebula-contrib/ngbatis/issues/111 只是猜测哈

zhangxk-ocean commented 1 year ago

不是,我用的hosts

zhangxk-ocean commented 1 year ago

感觉这个是扫描包出的问题 image zhelia这俩注解一起用也没问题吧,我试了试其他的项目,也没事

CorvusYe commented 1 year ago

我也没这么写过诶,回头验证下,配置中心用的是啥,nacos 吗,把配置放到配置中心看看?

zhangxk-ocean commented 1 year ago

配置中心用的nacos,配置就放在了nacos里

zhangxk-ocean commented 1 year ago

我试了下,把Mapper和mapper.xml删掉,就能正常启动了,因为mapper报的错

CorvusYe commented 1 year ago

nebula.pool-config.min-conns-size = 0 ? 这个值改成正的试试,让一启动就连接数据库,排除一下配置没读到的问题 之后再来排查是不是 bean 没扫描到的问题

zhangxk-ocean commented 1 year ago

这个值设置的是2

zhangxk-ocean commented 1 year ago

报错的原因应该是是mapper调用不到mapper.xml里面的方法

zhangxk-ocean commented 1 year ago

或者是service层调用mapper.java里的方法时报的错

CorvusYe commented 1 year ago

是动态代理的过程没执行。代理类没生成,asm-debug 这个文件夹没生成的话,也说明 jvm 中没有接口对应的实现类

CorvusYe commented 1 year ago

没看版本 断点在入口就行了,要看什么呢 image

你在这里往下执行,到 if nebula.hosts 的判断。 使用了 nacos 的话,这个方法会进两次,一次是空的直接跳过 if,第二次才会真正读到值

zhangxk-ocean commented 1 year ago

看到了,里面的nebulaPool的值是原始值,然后我就把nacos配置放到了bootstrap配置文件中,启动成功了,问题就是没有加载nacos里的配置,这是什么原因呢

CorvusYe commented 1 year ago

两次 if 前读取的配置都是原始值吗?这个我还得再跟下

zhangxk-ocean commented 1 year ago

这是因为没有加载到nacos的配置

CorvusYe commented 1 year ago

这边配置读取用的是 ConfigurableEnvironment 的接口, Springcloud 用的也是这个接口。

这是因为没有加载到nacos的配置

所以是项目搭建的问题?是的话,记得来记录下解决的过程哈

zhangxk-ocean commented 1 year ago

哈哈,也是个简单的问题,namespace错了,导致配置没加载上

CorvusYe commented 1 year ago

看来是解决了?可以可以~

zhangxk-ocean commented 1 year ago

解决了