mybatis-3-config.dtd 改为本地校验,避免无法启动

最近突然应用无法正常启动,报错信息如下:


2020-03-06 14:19:08.785 INFO [main] [---] o.s.b.f.xml.XmlBeanDefinitionReader :317 - Loading XML bean definitions from class path resource [mybatis-config/mybatis-setting.xml]org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath:mybatis-config/mybatis-setting.xml]Offending resource: file [/usr/local/ics/conf/META-INF/spring/applicationContext.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [mybatis-config/mybatis-setting.xml]; nested exception is java.net.ConnectException: Connection timed out
根据错误信息Failed to import bean definitions可以知道是加载定义文件超时,因此只要改为本地校验就可以解决。

找到mybatis-setting.xml文件,找到头部定义如下:

<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

修改为以下内容:

<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "org/apache/ibatis/builder/xml/mybatis-3-config.dtd">
为什么这样修改,配置文件mybatis-setting.xml 定义中dtd校验文件是mybatis-3-config.dtd,因此找到mybatis3的jar包,并找到对应的dtd文件,请看以下图:

下面再分享下解决这个问题的过程:

  1. 首先根据报错信息判断是网络连接超时,且是由于加载dtd校验文件导致的。
  2. 于是各种搜索查找改为本地校验的方法。
  3. 最后在iteye中找到如下内容:

4. 参考文章中提到的,将链接改为:./mybatis-3-config.dtd

5. 改为启动报错如下,原因还是找不到文件:

Caused by: java.io.FileNotFoundException: class path resource [mybatis-3-config.dtd] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)

6. 当中尝试过把mybatis3的jar包中的dtd文件复制到跟mybatis-setting.xml同目录,启动依然报错;于是调度模式启动,断点设置在:ClassPathResource 162行。

7. 通过本段代码可以知道这边会通过类加载器获取本地文件,因此这个路径配置可以是类路径。于是就找到了mybatis3的jar包中的dtd文件。把对应的类路径写在mybatis-setting.xml中。启动成功。

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据