在项目中发现一个问题,mybatis在调用存储过程的时候,存储过程又返回值得参数,如果参数都不传会出错,如果有多个只传一个不会出错,然后去看了下源码发现了问题
在DefaultResultHandler里面发现了问题
如果传参是多个参数的话 MetaObject 里面有个字段是是一个ObjectWrapper 类型,真实类型是MapWrapper,如果参数是空的对应的是BeanWrapper,
对应的MetaObject没有参数的话得到了Null,然后在下面setValue就会抛出异常了
final MetaObject metaParam = configuration.newMetaObject(parameterObject);
metaParam.setValue(parameterMapping.getProperty(), typeHandler.getResult(cs, i + 1))
setValue底层调用的是Mybatis里面有个Reflector对象,获取不到返回参数的名称就会报错,
public Invoker getSetInvoker(String propertyName) {
Invoker method = setMethods.get(propertyName);
if (method == null) {
throw new ReflectionException("There is no setter for property named '" + propertyName + "' in '" + type + "'");
}
return method;
}
posted on 2022-03-11 17:13 wubin19881121 阅读(108) 评论(0) 编辑 收藏 举报