Question

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
Was it helpful?

Solution

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" />
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top