`

mybatis dtd找不到问题

阅读更多

项目中集成Mybatis与Spring,使用的是Mybatis3.2.7,以及Spring4.0.5,mybatis-spring-1.2.2;
因为项目组成员想要偷懒,将数据从DB中查询出来时需要将字段映射为Map,而不想封装成Bean.

默认情况下,Mybatis对Map的解析生成, 如果值(value)为null的话,那么key也不会被加入到map中.
于是对Map遍历时,key就遍历不到,因为前端工具的需要,必须有这个key,网上搜索后发现需要设置callSettersOnNulls 这个属性.
那就设置呗, 在 sqlSessionFactory 的定义中,指定 configLocation 属性,指向另一个文件,如下所示

文件清单: mybatis-env-setting.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE configuration   
  3.     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
  4.     "http://mybatis.org/dtd/mybatis-3-config.dtd">   
  5.   
  6. <!--  
  7.     如果内网机器报错,请使用下面这种笨办法 
  8.  -->  
  9. <!--   
  10. <!DOCTYPE configuration  
  11.         PUBLIC "-//www.mybatis.org//DTD Config 3.0//EN"  
  12.         "E:/bao/tomcat/apache-tomcat-6.0.14/webapps/pmsys/WEB-INF/classes/mybatis/mybatis-3-config.dtd">  
  13.  -->  
  14.   
  15. <configuration>  
  16.     <settings>  
  17.       <!-- 只设置需要的,其他使用默认值 -->  
  18.       <!-- 开启缓存,默认就是开启的,2层开关,需要在Mapper文件中也指定 cache 标签才会真正使用缓存 -->  
  19.       <setting name="cacheEnabled" value="true"/>  
  20.       <!-- 在null时也调用 setter,适应于返回Map,3.2版本以上可用 -->  
  21.         <setting name="callSettersOnNulls" value="true"/>  
  22.     </settings>  
  23. </configuration>  


然后使用,一切正常,OK.
过了几天, 实施项目时出BUG了, 因为是企业内网服务器,不能访问 mybatis.org,于是启动出错.
【Mybatis 这个渣渣,在启动时会去获取并校验DTD,目前还不知道在哪里配置让其不进行校验.】
网上搜索半天,没有好的解决办法, 看到有方法说将dtd下载到本地,然后直接指定路径,就像上面注释掉的那部分一样。

问题也算是解决了,可是很土,而且各个机器不一定都有同样的目录,这种掉渣的方法肯定会遭人诟病的。
于是百度谷歌又搜索了半天,没找到办法,根本没有人提这茬。

于是想着自己翻源码看看:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. public class SqlSessionFactoryBean   
  2.     implements FactoryBean<SqlSessionFactory>, InitializingBean,   
  3.     ApplicationListener<ApplicationEvent> {  
  4.   
  5.   private static final Log logger = LogFactory.getLog(SqlSessionFactoryBean.class);  
  6.   // 这里可以配置configLocation资源  
  7.   private Resource configLocation;  
  8.   
  9.   private Resource[] mapperLocations;  
  10.   
  11.   private DataSource dataSource;  
  12.   
  13.   private TransactionFactory transactionFactory;  
  14.   // 这里可以配置configurationProperties属性  
  15.   private Properties configurationProperties;  
  16.   
  17.   ......  
  18.   
  19.   protected SqlSessionFactory buildSqlSessionFactory() throws IOException {  
  20.   
  21.     Configuration configuration;  
  22.   
  23.     XMLConfigBuilder xmlConfigBuilder = null;  
  24.     // 先查找 configLocation 属性  
  25.     if (this.configLocation != null) {  
  26.       xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), nullthis.configurationProperties);  
  27.       configuration = xmlConfigBuilder.getConfiguration();  
  28.     } else {  
  29.       if (logger.isDebugEnabled()) {  
  30.         logger.debug("Property 'configLocation' not specified, using default MyBatis Configuration");  
  31.       }  
  32.       // 如果找不到configLocation,就只使用 configurationProperties  
  33.       configuration = new Configuration();  
  34.       configuration.setVariables(this.configurationProperties);  
  35.     }  
  36.   
  37.     ......  


看到了 configurationProperties 这个属性,可是 该怎么设置呢,总算找到了一篇很靠谱的学习笔记: Spring的Bean之设置Bean值

于是,抄袭之,自己设置了一下相应的属性

形成的配置文件片段如下所示:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <!-- myBatis配置 -->  
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  3.     <property name="dataSource" ref="dataSource" />  
  4.       
  5.     <!-- 表示在mybatis.mapping包或以下所有目录中,以 Mapper.xml结尾所有文件 -->  
  6.     <property name="mapperLocations">  
  7.         <value>classpath:com/cncounter/dao/oracle/**/*Mapper.xml</value>  
  8.         <!--   
  9.         <list>  
  10.             <value>classpath:com/cncounter/dao/oracle/res/*Mapper.xml</value>  
  11.             <value>classpath:com/cncounter/dao/oracle/user/*Mapper.xml</value>  
  12.         </list>  
  13.          -->  
  14.     </property>  
  15.     <!--   
  16.     <property name="configLocation">  
  17.         <value>classpath:mybatis/mybatis-env-setting.xml</value>  
  18.     </property>  
  19.      -->  
  20.     <!--  切换一种方式,不配置configLocation  -->  
  21.     <property name="configurationProperties">  
  22.         <props>  
  23.             <prop key="cacheEnabled">true</prop>  
  24.             <prop key="callSettersOnNulls">true</prop>  
  25.         </props>  
  26.     </property>  
  27. </bean>  

 

启动没报错,但是还没检验.应该没多大问题...

补充: 还是不起作用,于是没法子了,只好拆开Mybatis的源码,找到类 org.apache.ibatis.session.Configuration ,然后,在自己的目录下把源码拷出来, 自己在test目录建一个包,建一个类,和Configuration一模一样,然后修改 callSettersOnNulls 的默认值为 true,然后找到编译好的3个class文件(有内部类),替换到mybatis-3.2.7.jar中去,OK,成功解决。

按理说应该是编译整个mybatis的,但是maven有点坑,目前还不想这样做

看了 mybatis高级应用系列一:分页功能 这篇文章,发觉冤枉 MyBatis了,其实是 Mybatis-Spring挖下的坑, 校验的时候不走Mybatis的默认通道, 而是自己解析了对应的XML文件,还要去网上搜索dtd文件,巨坑无比啊.

给了 configurationProperties 这么个选项,却不使用,真是不好。

附上一篇, 如何解决Spring附加组件中dtd的这种坑

 

 

本文原文地址:http://blog.csdn.net/renfufei/article/details/39646207

分享到:
评论

相关推荐

    mybatis-dtd.rar

    这通常是由于开发环境中缺少对MyBatis DTD的引用或者IDE(如IntelliJ IDEA、Eclipse)的配置不正确导致的。为了解决这个问题,我们可以按照以下步骤操作: 1. **添加DTD引用**: 在`mybatis-config.xml`文件的顶部...

    mybatis-dtd约束文件

    - DTD在这个文件中起到约束和验证的作用,确保XML文件符合MyBatis的规范。 - 例如,`&lt;select&gt;`, `&lt;insert&gt;`, `&lt;update&gt;`, `&lt;delete&gt;`元素都是由DTD定义的,分别用于定义SQL查询、插入、更新和删除操作。 3. **DTD...

    mybatis-3-config/mapper.dtd 解决mybatis头文件报错

    解决mybatis头文件报错 下载好压缩包 解压将文件放到本地文件夹 例如 D盘的哪个文件夹 D:\mybatis\ ;然后打开eclipse -&gt;Window-&gt;prefenrence-&gt;XML-&gt;XML Catalog-&gt;User Specifiled Entreis-&gt;Add-&gt;Location(此处是你...

    mybatis-3-config.dtd mybatis-3-mapper.dtd

    在MyBatis中,有两个重要的DTD(文档类型定义)文件,即`mybatis-3-config.dtd`和`mybatis-3-mapper.dtd`,它们在MyBatis的配置和映射文件中起到关键作用。 `mybatis-3-config.dtd`文件是MyBatis配置文件的DTD,...

    mybatis配置dtd文件

    通过这两个DTD文件,MyBatis确保了XML配置文件的正确性,避免了因语法错误导致的运行时问题。开发者可以根据这些定义来编写和组织自己的XML配置,实现与数据库的高效交互。 总结来说,`mybatis-3-config.dtd`和`...

    mybatis-generator-config_1_0.dtd

    http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd访问不到了怎么办,xml中引用报红,不能校验了 解决办法 mybatis-generator-config_1_0.dtd文件存在于mybatis-generator-core-1.3.2.jar包中,路径如下org/...

    mybatis配置xml最新dtd文件

    MyBatis是一个流行的Java持久层框架,它允许开发者将SQL语句直接集成到XML或注解中,提供了灵活的数据访问接口。在MyBatis的配置和映射文件中,DTD(Document Type Definition)文件起着至关重要的作用。DTD定义了...

    mybatis dtd 文件

    MyBatis是一个流行的Java持久层框架,它允许开发者将SQL语句直接集成到XML或注解配置中,提供了灵活的数据访问层。在本主题中,我们主要关注的是"Mybatis DTD文件",这是一个用于验证MyBatis配置文件的文档类型定义...

    mybatis-3-mapper.rar

    解决这些问题后,开发者就能在编写MyBatis的XML映射文件时享受到IDE提供的便利,提高编码效率。同时,了解并掌握DTD在XML文件中的作用,对于理解MyBatis的工作原理和优化开发环境都是至关重要的。

    mybatis-3-mapper.dtd文件下载

    Mybatis 是一个流行的 Java 持久层框架,它简化了...在开发过程中,如果遇到解析错误,很可能是由于这两个 DTD 文件的缺失或者版本不匹配导致的。因此,确保拥有正确的 DTD 文件对于顺利进行 Mybatis 开发至关重要。

    mybatis的两个dtd文件

    因此,当开发环境中缺少这些DTD文件时,会出现XML文件不能正常使用的现象,通常会报出类似“找不到DTD”的错误。 为了确保MyBatis的正常工作,开发者需要确保这两个DTD文件在类路径中可用。通常,MyBatis的jar包里...

    mybatis-3-mapper.dtd.zip

    在开发环境中,如果网络不稳定或者访问速度慢,可能导致MyBatis无法正常加载远程的DTD文件,从而影响到项目的构建和运行。此时,`mybatis-3-mapper.dtd.zip`压缩包就派上用场了。你可以将这个压缩包中的`mybatis-3-...

    mybatis-3-mapper.dtd

    总之,`mybatis-3-mapper.dtd`是MyBatis框架中不可或缺的一部分,它使开发人员能够在编写mapper.xml文件时享受到更好的开发体验,同时也确保了XML配置的正确性和一致性。理解和掌握这个DTD文件中的元素和属性,能够...

    spring_mybatis_dtd_lib

    这个名为"spring_mybatis_dtd_lib"的压缩包文件包含了Spring MVC 3和4版本,MyBatis 3,以及MySQL 5.1的相关库文件,这些都是开发基于Java的Web应用程序时不可或缺的部分。下面将详细讲解这些知识点。 **1. Spring...

    mybatis的两个Dtd文件,config.dtd mapper.dtd

    总结来说,`config.dtd`和`mapper.dtd`是MyBatis框架中不可或缺的组成部分,它们规定了配置文件和映射文件的结构,使得XML文件的编写更加规范,同时也提供了IDE的智能提示,增强了开发体验。通过熟练掌握这两个DTD...

    Mybatis-3-config-mapper.dtd

    总的来说,`mybatis-3-config.dtd` 和 `mybatis-3-mapper.dtd` 是Mybatis框架中不可或缺的部分,它们为XML配置文件提供了语义上的支持,使得开发者可以按照预定义的规则进行配置,从而更好地管理和操作数据库。...

    mybatis-3-mapper.dtd下载

    eclipse中mybatis得mapper文件不提示 1、下载该文件到你的硬盘文件夹下 2、windows --&gt;preferences--&gt;xml--&gt;xml catalog--&gt;add--&gt;fileSystem.. 后再设置 key type--&gt;public id key--&gt;加入xml...

    【免费】mybatis3.2.3所需的jar包+mybatis3.2.3中文帮助文档+mybatis-config.dtd

    这个jar包是使用MyBatis进行开发时必不可少的部分,需要将其添加到项目的类路径中。 其次,`mybatis-config.dtd`文件是MyBatis配置文件的DTD(Document Type Definition),定义了`mybatis-config.xml`文件的结构和...

    mybatis的configDTD和apperDTD下载和安装文档说明

    在下载和安装MyBatis的configDTD和apperDTD时,通常并不需要手动下载单独的DTD文件。MyBatis的JAR包中已经包含了这些DTD,当解析XML配置文件时,JAR包中的DTD会被自动引用。然而,如果你在离线环境中工作或者需要对...

Global site tag (gtag.js) - Google Analytics