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出对应的自定义实体类。
它的作用就是用反射的方式为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才不会报错。