一、背景
在使用maven搭建ssm时出现了以下错误:
ERROR [RMI TCP Connection(2)-127.0.0.1] - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [D:\tools\apache-tomcat-9.0.16\webapps\learnssm_maven_war\WEB-INF\classes\spring\applicationContext-dao.xml]: Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
二、初步分析问题
1.MalformedParameterizedTypeException的意思是“格式错误的参数化异常”
2.网上参与文章
2.1.Maven依赖冲突解决方案:https://www.jianshu.com/p/b08364ce234f
2.2.最终发现的原因是ibatis和mybatis冲突了:https://blog.youkuaiyun.com/4color/article/details/70139029
三、解决延伸问题
1.Maven依赖冲突解决方案中说的"mvn dependency:tree -Dverbose" 并未出现“omitted for conflict with”的字样,所以这里的冲突问题不能用采用这种方法。
2.去除pom.xml中的ibatis依赖是可以解决问题,又如何从程序的角度去分析冲突呢?
四、根据异常抛出点来追溯问题根源
1.定位到最后的报错点并断点调试
2.按F5进入BeanCreationException的构造函数里,查看错误对象的相关信息,展开后定位到真正的报错点,然后断点,再调试到此,一般到这里后就可以推出原因了。
3.我这里是因为"this.rawType"是用ibatis里的接口"TypeHandler",从“this.getRawType().getProtectionDomain().getCodeSource().getLocation().getFile()”的值可以看到,而“this.actualTypeArguments”实际使用时被传入的泛型参数,此处的调用者应该是在spring配置文件中定义的“SqlSessionFactoryBean”。在idea中双击shift键搜索“TypeHandler”是搜到有两个jar包都定义了它的,但一个有泛型,一个无泛型。