Reputation: 103
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$%'
</isNotEqual>
<isNotEqual prepend="AND" property="emp_fname" compareValue="0">
LOWER(first_name) like '$emp_fname$%'
</isNotEqual>
<isNotEqual prepend="AND" property="payId" compareValue="0">
LOWER(assignment_number) like '$payId$%'
</isNotEqual>
<isNotEqual prepend="AND" property="corp_id" compareValue="0">
LOWER(corp_id) like '$corp_id$%'
</isNotEqual>
<isNotEqual prepend="AND" property="manager_lname" compareValue="0">
LOWER(supervisor_name) like '$manager_lname$%'
</isNotEqual>
<isNotEqual prepend="AND" property="manager_fname" compareValue="0">
LOWER(supervisor_name) like '%, $manager_fname$%'
</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
Upvotes: 1
Views: 17795
Reputation: 10004
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" />
Upvotes: 6