苍穹外卖——报错:Parameter 'xxx' not found. Available parameters are [arg0, collection, list]] with root cause
背景:
在执行过程中,报错:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'orderDetails' not found. Available parameters are [arg0, collection, list]] with root cause.
疑问的点:代码方面都没有问题,但是往数据库中插入数据时一直报错,一直没找到原因。
解决:
将项目中的target文件夹删掉之后,解决了问题。
分析:
可能的原因有下面几种:
- 编译错误残留
- 在项目编译过程中,可能由于某些原因导致编译不完整或出现错误,这些错误被写入到了
target
文件夹中的编译结果文件中。例如,MyBatis 在生成映射文件的字节码或进行动态 SQL 解析时出现了问题,但错误结果被缓存到了编译后的文件中。 - 删除
target
文件夹后,项目重新编译,消除了之前的错误编译结果,从而解决了问题。
- 在项目编译过程中,可能由于某些原因导致编译不完整或出现错误,这些错误被写入到了
- 缓存问题
- MyBatis 或 Spring 框架在运行时可能会对一些配置或映射信息进行缓存。如果缓存的数据出现错误,就可能导致异常。而删除
target
文件夹后,这些缓存被清除,重新编译和运行时使用了正确的配置和映射。 - 可能是在开发过程中对 MyBatis 的映射文件或 Java 代码进行了修改,但缓存没有及时更新,导致运行时仍然使用旧的、错误的配置信息。
- MyBatis 或 Spring 框架在运行时可能会对一些配置或映射信息进行缓存。如果缓存的数据出现错误,就可能导致异常。而删除
- 依赖冲突或版本问题
target
文件夹中可能包含了一些旧版本的依赖库或编译后的文件,这些文件与当前项目的其他部分存在冲突。删除target
文件夹后,重新编译时会拉取正确版本的依赖,解决了冲突问题。- 可能是 MyBatis 的版本与其他框架(如 Spring)的版本不兼容,导致在运行时出现异常。重新编译可能会解决这种兼容性问题。