spring mybatis 整合问题Error parsing Mapper XML. Cause: java.lang.NullPointerException

本文讨论了在使用MyBatis框架时遇到的初始化错误问题,特别是当配置文件路径设置不当时,如何导致多次扫描同一配置文件并引发错误。提供了修正配置的方法,避免了此类问题的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

14:30:40,872 DEBUG SqlSessionFactoryBean:431 - Parsed configuration file: 'class path resource [mybatis/mybatis-config.xml]'
14:30:40,883  WARN XmlWebApplicationContext:489 - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0' defined in file

[E:\IdeaProjects\xgexpress\target\xgexpress\WEB-INF\classes\spring\spring-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file

[E:\IdeaProjects\xgexpress\target\xgexpress\WEB-INF\classes\spring\spring-context.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource:

'file [E:\IdeaProjects\xgexpress\target\xgexpress\WEB-INF\classes\mybatis\mybatis-config.xml]';

nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.

doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:116)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:611)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1763)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:618)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:565)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1487)
    at javax.management.remote.rmi.RMIConnectionImpl.access300(RMIConnectionImpl.java:97)
    at javax.management.remote.rmi.RMIConnectionImplPrivilegedOperation.run(RMIConnectionImpl.java:1328)
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1420)
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:848)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
    at sun.rmi.transport.Transport1.run(Transport.java:177)
    at sun.rmi.transport.Transport1.run(Transport.java:174)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
    at sun.rmi.transport.tcp.TCPTransportConnectionHandler.run0(TCPTransport.java:811)
    at sun.rmi.transport.tcp.TCPTransportConnectionHandler.run(TCPTransport.java:670)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutorWorker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

原因:

当配置

<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>

<property name="mapperLocations" value="classpath:mybatis/**/*.xml"></property>

会扫描两遍mybatis-config.xml文件 并没有按照文件夹级别扫描,而是文件也一起扫描了,不知道是不是mybatis的bug.

 

配置文件更改为

即可

转载于:https://www.cnblogs.com/waising/p/4462963.html

"D:\java\IntelliJ IDEA 2019.2.4\jbr\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\java\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=54212:D:\java\IntelliJ IDEA 2019.2.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\java\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar;D:\java\IntelliJ IDEA 2019.2.4\plugins\junit\lib\junit-rt.jar;D:\java\IntelliJ IDEA 2019.2.4\plugins\junit\lib\junit5-rt.jar;D:\java\ljj-di4\target\test-classes;D:\java\ljj-di4\target\classes;D:\MavenRepository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;D:\MavenRepository\mysql\mysql-connector-java\8.0.11\mysql-connector-java-8.0.11.jar;D:\MavenRepository\com\google\protobuf\protobuf-java\2.6.0\protobuf-java-2.6.0.jar;D:\MavenRepository\junit\junit\4.12\junit-4.12.jar;D:\MavenRepository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 Test1,testGetMemberByUnameAndSex java.lang.ExceptionInInitializerError at Test1.testGetMemberByUnameAndSex(Test1.java:80) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.NullPointerException at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:52) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:36) at com.itheima.untils.MyBatisUtils.<clinit>(MyBatisUtils.java:20) ... 23 more Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.NullPointerException at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:121) at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:98) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:50) ... 25 more Caused by: java.lang.NullPointerException at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:105) ... 27 more Process finished with exit code -1 ??? @Test public void testGetMemberByUnameAndSex(){ SqlSession session= MyBatisUtils.getSession(); MemberDaoMapper memberDaoMapper=session.getMapper(MemberDaoMapper.class); List<Member> memberList=memberDaoMapper.getMemberByUnameAdnSex("李四",0); for(Member member:memberList){ System.out.println(member); } session.close(); }???<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.mapper.MemberDaoMapper"> <!-- 插入会员(主键自增,不指定member_id) --> <insert id="insert" parameterType="com.itheima.pojo.Member" keyProperty="member_id" useGeneratedKeys="true"> insert into ms_member(uname, password, email, sex, mobile) values (#{uname}, #{password}, #{email}, #{sex}, #{mobile}) </insert> <!-- 批量插入(无需指定member_id) --> <insert id="insert1"> insert into ms_member(uname, password, email, sex, mobile) values ('李白', '123456', 'aabb@qq.com', 0, '2434234'), ('程咬金', '123456', 'yyrry@qq.com', 0, '234324') </insert> <!-- 根据ID查询会员 --> <select id="getMemberById" resultType="com.itheima.pojo.Member"> select member_id, uname, password, email, sex, mobile from ms_member where member_id = #{member_id} </select> <!-- 查询所有会员 --> <select id="findAll" resultType="com.itheima.pojo.Member"> select * from ms_member </select> <!-- 按用户名和性别查询(方法1:参数顺序传递) --> <select id="getMemberByUnameAndSex" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{0} and sex = #{1} </select> <!-- 按用户名和性别查询(方法2:@Param注解命名参数) --> <select id="getMemberByUnameAndSex1" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <!-- 按用户名和性别查询(方法3:Map参数) --> <select id="getMemberByUnameAndSex2" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <!-- 按用户名和手机号查询(动态SQL) --> <select id="findMemberByUnameAndMobile" resultType="com.itheima.pojo.Member" parameterType="com.itheima.pojo.Member"> select * from ms_member where 1=1 <if test="uname != null and uname != ''"> and uname like concat('%', #{uname}, '%') </if> <if test="mobile != null and mobile != ''"> and mobile like concat('%', #{mobile}, '%') </if> </select> <!-- 删除会员 --> <delete id="deleteById" parameterType="Integer"> delete from ms_member where member_id = #{member_id} </delete> <!-- 更新会员 --> <update id="updateById" parameterType="com.itheima.pojo.Member"> update ms_member set uname = #{uname}, password = #{password}, email = #{email}, sex = #{sex}, mobile = #{mobile} where member_id = #{member_id} </update> </mapper>????<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.mapper.MemberDaoMapper"> <!-- insert元素(修正后) --> <insert id="insert" parameterType="com.itheima.pojo.Member" keyProperty="member_id" useGeneratedKeys="true"> insert into ms_member(uname, password, email, sex, mobile) values (#{uname}, #{password}, #{email}, #{sex}, #{mobile}) </insert> <!-- 批量插入示例 --> <insert id="insert1"> insert into ms_member(uname, password, email, sex, mobile) values ('李白', '123456', 'aabb@qq.com', 0, '2434234'), ('程咬金', '123456', 'yyrry@qq.com', 0, '234324') </insert> <!-- 根据ID查询会员 --> <select id="getMemberById" resultType="com.itheima.pojo.Member"> select member_id, uname, password, email, sex, mobile from ms_member where member_id = #{member_id} </select> <!-- 查询所有会员 --> <select id="findAll" resultType="com.itheima.pojo.Member"> select * from ms_member </select> <!-- 按用户名和性别查询(修正方法名和SQL) --> <select id="getMemberByUnameAndSex" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <select id="getMemberByUnameAndSex1" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <select id="getMemberByUnameAndSex2" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <!-- 按用户名和手机号查询(已修正mobile条件) --> <select id="findMemberByUnameAndMobile" resultType="com.itheima.pojo.Member" parameterType="com.itheima.pojo.Member"> select * from ms_member where 1=1 <if test="uname != null and uname != ''"> and uname like concat('%', #{uname}, '%') </if> <if test="mobile != null and mobile != ''"> and mobile like concat('%', #{mobile}, '%') </if> </select> <!-- delete元素 --> <delete id="deleteById" parameterType="Integer"> delete from ms_member where member_id = #{member_id} </delete> <!-- update元素 --> <update id="updateById" parameterType="com.itheima.pojo.Member"> update ms_member set uname = #{uname}, password = #{password}, email = #{email}, sex = #{sex}, mobile = #{mobile} where member_id = #{member_id} </update> </mapper>
最新发布
06-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值