昨天在编写自己的TypeHandler时,突然抛出一个异常,异常信息为:
java.lang.ExceptionInInitializerError at com.quelongjiang.mybatis.sys.test.NewUserTypeHandlerTest.<clinit>(NewUserTypeHandlerTest.java:20) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:195) at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:244) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:241) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 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.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [D:\Myeclipse2014 Program\Mybatis_Transaction_mnager\target\classes\mapper\sys\UserTypeHandlerModelMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias '"com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler"'. Cause: java.lang.ClassNotFoundException: Cannot find class: "com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler" at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:735) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.quelongjiang.mybatis.dao.impl.UserDaoImpl.<clinit>(UserDaoImpl.java:14) ... 23 more Caused by: org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [D:\Myeclipse2014 Program\Mybatis_Transaction_mnager\target\classes\mapper\sys\UserTypeHandlerModelMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias '"com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler"'. Cause: java.lang.ClassNotFoundException: Cannot find class: "com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler" at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:522) at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:381) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579) ... 35 more Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias '"com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler"'. Cause: java.lang.ClassNotFoundException: Cannot find class: "com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler" at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:120) at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:92) at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:520) ... 38 more Caused by: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias '"com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler"'. Cause: java.lang.ClassNotFoundException: Cannot find class: "com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler" at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:118) at org.apache.ibatis.builder.BaseBuilder.resolveTypeHandler(BaseBuilder.java:126) at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.buildParameterMapping(SqlSourceBuilder.java:121) at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.handleToken(SqlSourceBuilder.java:67) at org.apache.ibatis.parsing.GenericTokenParser.parse(GenericTokenParser.java:69) at org.apache.ibatis.builder.SqlSourceBuilder.parse(SqlSourceBuilder.java:45) at org.apache.ibatis.scripting.defaults.RawSqlSource.<init>(RawSqlSource.java:46) at org.apache.ibatis.scripting.defaults.RawSqlSource.<init>(RawSqlSource.java:40) at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseScriptNode(XMLScriptBuilder.java:58) at org.apache.ibatis.scripting.xmltags.XMLLanguageDriver.createSqlSource(XMLLanguageDriver.java:44) at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:94) at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:135) at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:128) at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:118) ... 40 more Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias '"com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler"'. Cause: java.lang.ClassNotFoundException: Cannot find class: "com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler" at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:120) at org.apache.ibatis.builder.BaseBuilder.resolveAlias(BaseBuilder.java:149) at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:116) ... 53 more Caused by: java.lang.ClassNotFoundException: Cannot find class: "com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler" at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:200) at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:89) at org.apache.ibatis.io.Resources.classForName(Resources.java:261) at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:116) ... 55 more
刚看到这个异常时,感觉很奇怪,我根本就没有在Mybatis中使用别名,怎么回报这个异常。后面,根据异常提示信息,找到相关配置文件UserTypeHandlerModelMapper.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="com.quelongjiang.mybatis.dao.UserTypeHandlerDao"> <resultMap type="com.quelongjiang.mybatis.model.UserTypeHandlerModel" id="uthmEntity"> <result property="uthm_id" column="uthm_id"/> <result property="uthm_name" column="uthm_name"/> <result property="uthm_describe" column="uthm_describe"/> <result property="uthm_user" column="uthm_user" typeHandler="com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler" /> <result property="uthm_createTime" column="uthm_createTime"/> </resultMap> <insert id="saveOneRecord"> insert into sys_usertypehandlermodel(uthm_id , uthm_name , uthm_describe , uthm_user , uthm_createTime) values(#{uthm_id} , #{uthm_name} , #{uthm_describe} , #{uthm_user , typeHandler="com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler"} , #{uthm_createTime}) </insert> <insert id="saveMoreRecord"> insert into sys_usertypehandlermodel(uthm_id , uthm_name , uthm_describe , uthm_user , uthm_createTime) values <foreach collection="list" item="item" separator=","> (#{item.uthm_id} , #{item.uthm_name} , #{item.uthm_describe} , #{item.uthm_user , typeHandler=com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler} , #{item.uthm_createTime}) </foreach> </insert> </mapper>
在id为saveOneRecord的insert语句中, typeHandler="com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler",使用双引号引起来。导致Mybatis将其作为别名进行解析。而又没有定义这么一个别名,导致抛出上面这个异常。其实,这个异常的解决办法很简单,只需要去除掉 typeHandler="com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler"的引号就可以了,即 typeHandler=com.quelongjiang.springSecurity.mybatis.typeHandler.NewUserTypeHandler。
这个异常信息当初困扰了我好一个多小时,后面,根据Mybatis官方帮助文档,才找到异常的解决办法,现记录一下,避免以后再出现这个错误。