2016-06-08 2 views
0

Tomcat start throw java.lang.StackOverflowError при использовании весеннего mybatis. Кроме того, эта ошибка возникает случайным образом, это очень странно.Tomcat start throw java.lang.StackOverflowError при использовании spring mybatis

ERROR org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:97) - Error while adding the mapper 'interface com.myWeb.dao.MyClassMapper' to configuration. 
java.lang.StackOverflowError 
    at java.lang.String.getChars(String.java:783) 
    at java.lang.String.concat(String.java:1976) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:357) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:412) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1603) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder$ForEachHandler.handleNode(XMLScriptBuilder.java:160) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags(XMLScriptBuilder.java:83) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.access$800(XMLScriptBuilder.java:35) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder$IfHandler.handleNode(XMLScriptBuilder.java:167) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder$ChooseHandler.handleWhenOtherwiseNodes(XMLScriptBuilder.java:199) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder$ChooseHandler.handleNode(XMLScriptBuilder.java:187) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags(XMLScriptBuilder.java:83) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.access$800(XMLScriptBuilder.java:35) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder$ForEachHandler.handleNode(XMLScriptBuilder.java:152) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags(XMLScriptBuilder.java:83) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.access$800(XMLScriptBuilder.java:35) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder$TrimHandler.handleNode(XMLScriptBuilder.java:121) 
    at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags(XMLScriptBuilder.java:83) 
+0

поделиться своим mapper.xml – SiddP

+0

my mapper.xml автоматически генерируется без каких-либо модификаций. Кроме того, когда-нибудь он может начать успешно, а когда-то нет. это может доказать, что в моем файле mapper.xml нет ничего плохого. – philee

+0

Mapper автоматически генерируется, используя аннотацию или xml на основе – SiddP

ответ

0

OMG, после нескольких дней исследования, я, наконец, нашел problem.it, потому что Mybatis инициирует многослойную рекурсию, когда весной создание экземпляра сопоставителя и вызвать переполнение стека. я проследить на SqlSessionDaoSupport (MapperFactoryBean унаследовать) в org.mybatis.spring.support и найти это:

@Autowired(required = false) 
public final void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { 
    if (!this.externalSqlSession) { 
    this.sqlSession = new SqlSessionTemplate(sqlSessionFactory); 
    } 
} 

@Autowired(required = false) 
public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { 
    this.sqlSession = sqlSessionTemplate; 
    this.externalSqlSession = true; 
} 

Когда MapperFactoryBean экземпляр создается, весна будет вводить SqlSessionTemplate для него. При вводе SqlSessionTemplate он получит все Дао из контейнера. Дао был создан в контейнере для соответствующего компонента, который может захватить, но если компонент не был создан, то Spring создаст Dao из MapperFactoryBean. при создании MapperFactoryBean он снова будет введен в SqlSessionTemplate. Это будет продолжаться до тех пор, пока все Дао не будут созданы. Поэтому это приведет к ошибке завершения переполнения стека случайно, если вам не повезло.

Вкратце: это потому, что моя версия mybatis-spring слишком низкая (я использую версию 1.1.1). И этот тип autwired был удален из setSqlSessionTemplate и setSqlSessionFactory в версии 1.2.0.

Итак: сменив версию mybatis-spring на версию выше 1.2.0, эта проблема была решена.