wubin19881121

导航

在项目中发现一个问题,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编辑  收藏  举报