`
thinkgem
  • 浏览: 580298 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

解决MyBatis的Mapper XML错误,系统起不来,也不报错问题

阅读更多

MyBatis有一个非常头疼的问题,就是当Mapper XML写法定义错误的时候,系统起不来,但也不报错,始终卡到如下信息位置:

 

信息: Initializing Spring root WebApplicationContext

 

问题分析思路就不叙述了,直接说解决方法吧:

 

新建一个类,继承 org.mybatis.spring.SqlSessionFactoryBean 类,重载 buildSqlSessionFactory 方法,捕获 NestedIOException 异常,并打印异常,如下:

 

try {
	return super.buildSqlSessionFactory();
} catch (NestedIOException e) {
	e.printStackTrace(); // XML 有错误时打印异常。
	throw new NestedIOException("Failed to parse mapping resource: '" + mapperLocation + "'", e);
} finally {
	ErrorContext.instance().reset();
}

  

然后修改 spring 配置文件 org.mybatis.spring.SqlSessionFactoryBean 替换为刚才新建的类。

 

这样,当MyBatis解析Mapper遇到错误的时候就能输出到控制台了。

分享到:
评论
1 楼 redeyes200x 2015-05-04  
您好 我最近使用jeesite时碰到个奇怪的问题 求大神帮助来了

由于最近用jeesite整合pg流程,代码结构和适配做了些微调,但业务逻辑没有变化.

我在整合过程中,通过"代码生成器(gen)"的"业务表添加"把test_data添加后,发现不能在"业务表列表"中针对表记录直接删除.看了下后台日志,发现
        ..\GenTableColumnDao.xml中的:
<update id="deleteByGenTableId">
UPDATE gen_table_column SET
del_flag = #{DEL_FLAG_DELETE}
WHERE gen_table_id = #{genTable.id}
</update>
这段sql在后台maper后执行时,传入了两个id参数,
并且他们的值都相同,而且等于genTable.id的取值.
也就是说DEL_FLAG_DELETE的真实取值没有被传入,而被传递成genTable.id.
由于del_flag的长度是char(1),从而造成字段超过长度,导致后台报错.

可是同样是该文件中的语句:
<update id="delete">
UPDATE gen_table_column SET
del_flag = #{DEL_FLAG_DELETE}
WHERE id = #{id}
</update>
这段sql在后台maper后执行时,也传入了两个参数,
并且DEL_FLAG_DELETE可以传入正常的值1.

而这个delete和deleteByGenTableId又是在GenTableService.java中被同时触发的:
@Transactional(readOnly = false)
public void delete(GenTable genTable) {
genTableDao.delete(genTable);
genTableColumnDao.deleteByGenTableId(genTable.getId());
}

所以我就不知道这个问题出在哪里了.劳烦大神帮我看看这个问题应该怎么解决?



相关推荐

Global site tag (gtag.js) - Google Analytics