Using Spring 3.0.1 and myBatis yeilds NoClassDefFoundError for NodeletException

706 views
Skip to first unread message

mcobery

unread,
Jun 24, 2010, 9:09:00 PM6/24/10
to mybatis-user
Hi,

I tried to switch my application over to myBatis from iBatis 2.3.4.726
by just changing the maven dependency and I get the exception below
when I run my test suite. I am a newbie to iBatis in general and was
hoping someone could help me out. Am I doing something wrong? What
other information do you need?

Thanks in advance,

Marc

findPersonByLastName(com.constantcontact.persistence.dao.ContactDaoTest)
Time elapsed: 0.546 sec <<< ERROR!
java.lang.NoClassDefFoundError: com/ibatis/common/xml/NodeletException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getDeclaredConstructors(Class.java:1836)
at
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:
228)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:
920)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:
893)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:
485)
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:
557)
at
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:
895)
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:
425)
at
org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:
84)
at
org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:
1)
at
org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:
280)
at
org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:
304)
at
org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:
109)
at
org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:
75)
at
org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:
333)
at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:
220)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner
$1.runReflectiveCall(SpringJUnit4ClassRunner.java:301)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:
15)
at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:
303)
at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:
240)
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.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:
61)
at
org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:
70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at
org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:
180)
at
org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:
62)
at
org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:
140)
at
org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:
127)
at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:
345)
at
org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:
1009)
Caused by: java.lang.ClassNotFoundException:
com.ibatis.common.xml.NodeletException
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 47 more

Here is my sql-map-config:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map
Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
<settings enhancementEnabled="true"
maxTransactions="20"
maxRequests="32"
maxSessions="10"
useStatementNamespaces="true" />

<!-- Identify all SQL Map XML files to be loaded by this SQL map.
Relative to classpath -->
<sqlMap resource="sqlmaps/ContactSQL.xml"/>
</sqlMapConfig>

Here is my SQLMAP:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="com.constantcontact.persistence.model.Contact">
<typeAlias alias="contact"
type="com.constantcontact.persistence.model.Contact"/>

<parameterMap id="addParam" class="contact">
<parameter property="id" jdbcType="int"
javaType="java.lang.Long"/>
<parameter property="firstName" jdbcType="VARCHAR"
javaType="java.lang.String"/>
<parameter property="lastName" jdbcType="VARCHAR"
javaType="java.lang.String"/>
</parameterMap>

<parameterMap id="updateParam" class="contact">
<parameter property="id" jdbcType="INTEGER"
javaType="java.lang.Long"/>
<parameter property="firstName" jdbcType="VARCHAR"
javaType="java.lang.String"/>
<parameter property="lastName" jdbcType="VARCHAR"
javaType="java.lang.String"/>
</parameterMap>

<resultMap id="contactResult" class="contact">
<result property="id" column="contactid"/>
<result property="firstName" column="first_name"/>
<result property="lastName" column="last_name"/>
</resultMap>

<select id="findAll" resultMap="contactResult">
<![CDATA[
select * from contact
]]>
</select>

<select id="retrieve" resultMap="contactResult">
<![CDATA[
select * from contact where contactid = #value#
]]>
</select>

<insert id="create"
parameterClass="com.constantcontact.persistence.model.Contact" >
<selectKey resultClass="java.lang.Long" keyProperty="id">
SELECT nextval('contact_id_seq') AS id
</selectKey>
<![CDATA[
insert into contact (contactid,first_name,last_name)
values (#id#,#firstName#,#lastName# )
]]>
</insert>

<update id="update" parameterMap="updateParam">
<![CDATA[
update contact set first_name = ?, last_name = ? where
contactid = ?
]]>
</update>

<delete id="delete">
<![CDATA[
delete from contact where contactid = #value#
]]>
</delete>

<select id="findByLastName" resultMap="contactResult">
select * from contact where last_name = #value#
</select>
</sqlMap>

Larry Meadors

unread,
Jun 24, 2010, 9:49:57 PM6/24/10
to mybati...@googlegroups.com
Migrating from 2 to 3 will be a pretty significant task. I know there
has been some talk about a migration utility but nothing concrete.

Larry

--
Sent from my mobile device

Evan Dale

unread,
Jun 25, 2010, 5:28:08 AM6/25/10
to mybatis-user
Hello there,

Spring 3 does not natively support mybatis and ibatis 3. I'm also a
newbie who ran into this problem while messing around with both
frameworks. Support is now being requested by the Spring community.
More details can be found here:

http://jira.springframework.org/browse/SPR-5991

Thanks,
Evan

Clinton Begin

unread,
Jun 25, 2010, 10:49:07 AM6/25/10
to mybati...@googlegroups.com
I wonder why Spring would care about that exception directly anyway?  Strange.

Clinton

Richard Yee

unread,
Jun 25, 2010, 11:15:29 AM6/25/10
to mybati...@googlegroups.com
Spring wraps and translates SQL and ibatis exceptions into it's own exception. Try extracting the class from the 2.x ibatis jar and including it with the 3.0 project to see if it runs. Some other classes might also need to be extracted to satisfy other references.

Richard

Sent from my iPhone
Reply all
Reply to author
Forward
0 new messages