设为首页 收藏本站
查看: 2736|回复: 0

[经验分享] mybatis dtd找不到问题

[复制链接]

尚未签到

发表于 2016-11-24 09:33:04 | 显示全部楼层 |阅读模式
  项目中集成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 



  • <?xml version="1.0" encoding="UTF-8"?>  
  • <!DOCTYPE configuration   
  •     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
  •     "http://mybatis.org/dtd/mybatis-3-config.dtd">   
  •   
  • <!--  
  •     如果内网机器报错,请使用下面这种笨办法 
  •  -->  
  • <!--   
  • <!DOCTYPE configuration  
  •         PUBLIC "-//www.mybatis.org//DTD Config 3.0//EN"  
  •         "E:/bao/tomcat/apache-tomcat-6.0.14/webapps/pmsys/WEB-INF/classes/mybatis/mybatis-3-config.dtd">  
  •  -->  
  •   
  • <configuration>  
  •     <settings>  
  •       <!-- 只设置需要的,其他使用默认值 -->  
  •       <!-- 开启缓存,默认就是开启的,2层开关,需要在Mapper文件中也指定 cache 标签才会真正使用缓存 -->  
  •       <setting name="cacheEnabled" value="true"/>  
  •       <!-- 在null时也调用 setter,适应于返回Map,3.2版本以上可用 -->  
  •         <setting name="callSettersOnNulls" value="true"/>  
  •     </settings>  
  • </configuration>  

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

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

于是想着自己翻源码看看:
[java] view plaincopy 



  • public class SqlSessionFactoryBean   
  •     implements FactoryBean<SqlSessionFactory>, InitializingBean,   
  •     ApplicationListener<ApplicationEvent> {  
  •   
  •   private static final Log logger = LogFactory.getLog(SqlSessionFactoryBean.class);  
  •   // 这里可以配置configLocation资源  
  •   private Resource configLocation;  
  •   
  •   private Resource[] mapperLocations;  
  •   
  •   private DataSource dataSource;  
  •   
  •   private TransactionFactory transactionFactory;  
  •   // 这里可以配置configurationProperties属性  
  •   private Properties configurationProperties;  
  •   
  •   ......  
  •   
  •   protected SqlSessionFactory buildSqlSessionFactory() throws IOException {  
  •   
  •     Configuration configuration;  
  •   
  •     XMLConfigBuilder xmlConfigBuilder = null;  
  •     // 先查找 configLocation 属性  
  •     if (this.configLocation != null) {  
  •       xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), nullthis.configurationProperties);  
  •       configuration = xmlConfigBuilder.getConfiguration();  
  •     } else {  
  •       if (logger.isDebugEnabled()) {  
  •         logger.debug("Property 'configLocation' not specified, using default MyBatis Configuration");  
  •       }  
  •       // 如果找不到configLocation,就只使用 configurationProperties  
  •       configuration = new Configuration();  
  •       configuration.setVariables(this.configurationProperties);  
  •     }  
  •   
  •     ......  

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

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

形成的配置文件片段如下所示:
[html] view plaincopy 



  • <!-- myBatis配置 -->  
  • <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  •     <property name="dataSource" ref="dataSource" />  
  •       
  •     <!-- 表示在mybatis.mapping包或以下所有目录中,以 Mapper.xml结尾所有文件 -->  
  •     <property name="mapperLocations">  
  •         <value>classpath:com/cncounter/dao/oracle/**/*Mapper.xml</value>  
  •         <!--   
  •         <list>  
  •             <value>classpath:com/cncounter/dao/oracle/res/*Mapper.xml</value>  
  •             <value>classpath:com/cncounter/dao/oracle/user/*Mapper.xml</value>  
  •         </list>  
  •          -->  
  •     </property>  
  •     <!--   
  •     <property name="configLocation">  
  •         <value>classpath:mybatis/mybatis-env-setting.xml</value>  
  •     </property>  
  •      -->  
  •     <!--  切换一种方式,不配置configLocation  -->  
  •     <property name="configurationProperties">  
  •         <props>  
  •             <prop key="cacheEnabled">true</prop>  
  •             <prop key="callSettersOnNulls">true</prop>  
  •         </props>  
  •     </property>  
  • </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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304811-1-1.html 上篇帖子: spring + mybatis 解决n+1 下篇帖子: Mybatis generator代码生成工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表