Error parsing Mapper XML. Cause: java.lang.NullPointerException

浪子不回头ぞ 提交于 2020-01-14 05:47:18

问题


I've been trying to convert from mybatis2 to mybatis3 and its giving me all sorts of problems. From the stacktrace im getting a Error Parsing Mapper XML for sqlMapConfig.xml which I take it means there is something wrong there however I cannot see it. I would greatly appreciate any help.

sqlMapConfig.xml

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings> 
        <setting name="cacheModelsEnabled" value="true" />
        <setting name="enhancementEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/> 
        <setting name="maxRequests" value="128"/> 
        <setting name="maxSessions" value="10"/>
        <setting name="maxTransactions" value="5"/> 
        <setting name="defaultStatementTimeout" value="0"/> 
        <setting name="statementCachingEnabled" value="true"/>
        <setting name="classInfoCacheEnabled" value="true"/> 
    </settings>

    <mappers>
        <mapper resource="com/fidelity/cmplnr/datasource/search_sql.xml"/>
    </mappers>


</configuration>

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:annotation-config />

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="${jdbc.url}" />
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <bean id="sqlMapClient" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="mapperLocations" value="classpath:sqlMapConfig.xml" />
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
    </bean>


    <bean id="ServiceImpl" class="com.fidelity.cmplnr.integration.ServiceImpl">
        <property name="sqlMapClient" ref="sqlMapClient" />
    </bean>

    <bean id="AuthenticationServiceImpl" class="com.fidelity.cmplnr.core.AuthenticationServiceImpl">
        <property name="sqlMapClient" ref="sqlMapClient" />
    </bean>


</beans>

search_sql.xml

<?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="searchService">

    <resultMap id="getEmpScrCombinedMap" type="com.fidelity.cmplnr.core.EMP_SCR">
        <result property="name" column="PERSON_FULL_NAME" />
        <result property="Payroll_ID" column="ASSIGNMENT_NUMBER" />
        <result property="corp_id" column="CORP_ID" />
        <result property="Manager" column="SUPERVISOR_NAME" />
        <result property="cost_center" column="SCOPING_6" />
    </resultMap>
    <select id="getEmpScrCombined" resultMap="getEmpScrCombinedMap" parameterType="java.util.Map">
        SELECT person_full_name, assignment_number, corp_id, supervisor_name, scoping_6

        FROM $table_name$

        WHERE plan_id = $plan_id$

         <if test= "$table_name$ = SSO_CMPLNR_COMBINED">

            <dynamic prepend="AND">
                <isNotEqual prepend="AND" property="emp_lname" compareValue="0">

                    LOWER(last_name) like '$emp_lname$&#37;'

                </isNotEqual>

                <isNotEqual prepend="AND" property="emp_fname" compareValue="0">

                    LOWER(first_name) like '$emp_fname$&#37;'

                </isNotEqual>

                <isNotEqual prepend="AND" property="payId" compareValue="0">

                    LOWER(assignment_number) like '$payId$&#37;'

                </isNotEqual>

                <isNotEqual prepend="AND" property="corp_id" compareValue="0">

                    LOWER(corp_id) like '$corp_id$&#37;'

                </isNotEqual>

                <isNotEqual prepend="AND" property="manager_lname" compareValue="0">

                    LOWER(supervisor_name) like '$manager_lname$&#37;'

                </isNotEqual>

                <isNotEqual prepend="AND" property="manager_fname" compareValue="0">

                    LOWER(supervisor_name) like '%, $manager_fname$&#37;'

                </isNotEqual>

            </dynamic>

         </if>


    </select>

</mapper>

stacktrace

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlMapClient' defined in class path resource [beans.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'class path resource [sqlMapConfig.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:546)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.fidelity.cmplnr.test.TestService.setUp(TestService.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.core.NestedIOException: Failed to parse mapping resource: 'class path resource [sqlMapConfig.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.NullPointerException
    at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:466)
    at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:340)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1469)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409)
    ... 34 more
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.NullPointerException
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:117)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:89)
    at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:464)
    ... 37 more
Caused by: java.lang.NullPointerException
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:105)
    ... 39 more

回答1:


In the SQLMapClient property mapperLocations expects mapper file not the configuration file( which is supplied to sessionfactory)

org.mybatis.spring.SqlSessionFactoryBean class calls the parse method which is trying to find mapper

public void parse() {
    if (!configuration.isResourceLoaded(resource)) {
      configurationElement(parser.evalNode("/mapper"));
      configuration.addLoadedResource(resource);
      bindMapperForNamespace();
    }

You can configure your mapper as below if all the mpper files are placed in folder sqlmap in classpath.

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


来源:https://stackoverflow.com/questions/21124796/error-parsing-mapper-xml-cause-java-lang-nullpointerexception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!