您的位置:首页 > 数据库

ibatis单元测试出现The error occurred while loading SqlMap -initialize type alias解决办法

2015-12-10 15:04 615 查看
ibatis项目运行正常,但是在单元测试时如果出现类似下面的异常:  
  The error occurred while loading SqlMap. 
- initialize type alias 
- The error occurred in <sqlMap embedded="XXX.XXX.xml,XXModel.XXX" xmlns="http://ibatis.apache.org/dataMapper" />.   
- Check the XXX.XXX, XXModel.XXX.]

解决办法有两种:
1.将单元测试工程设为启动项即可。
2.如果单元测试工程不设置为启动项,那么就需要在调用ibatis方法之前,new 一个所需的实体对象。

解释:
追踪到ibatis内核代码中,发现IBatisNet.Common.Utilities.TypesResolver类中有一个LoadTypeByIteratingOverAllLoadedAssemblies方法,

        它的作用就是用反射的方式为TypeAlias节点map出对应的自定义实体类。

        
private static Type LoadTypeByIteratingOverAllLoadedAssemblies(TypeAssemblyInfo typeInfo)
{
Type type = null;
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
type = assembly.GetType(typeInfo.TypeName, false, false);
if (type != null)
{
return type;
}
}
return type;
}
可以看到它用AppDomain.CurrentDomain.GetAssemblies()方法取得程序集,然后在这些程序集中按类名反射得到实体类型。问题就出在这里。如果你的实体类在一个不同于启动项目的程序集中,而且在你用ibatis访问数据库之前,这个程序集所包含的对象从来没有激活过。那么,这个方法是得不到实体类对应的程序集的,也就说你TypeAlias节点指向的实体类找不到,才会报如上的错误。而且要注意的是,所有的typeAlias会在第一次ibatis访问数据库的时候一次性加载,不管你这次有没有用到。

所以,有一个解决办法是在你的project访问数据库之前,实例化一个typeAlias对应的类,AppDomain就会加载对应的程序集,加载typeAlias才不会报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: