背景
- 历史原因导致,处理老项目的代码时候,清除了pom文件中的一些没用的Maven依赖,清除后代码运行都是正常无报错,测试环境跑了一段时间也没问题,上线后发现报错,经过排查发现是mapper层接口没有使用@Param注解,开始排查问题
一、进行问题定位
- 因为这次发布,只清除了pom文件中一些没用Maven依赖,经过对比pom文件发现,之前的同事引入了jpa依赖,将此依赖回复后,进行本地测试,发现问题解决了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
- 报错信息:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'mergeMsg' not found. Available parameters are [arg1, arg0, param1, param2]
在历史代码中有些同事在mapper没有使用@Param注解,尤其是多个参数时,没有使用@Param注解会报错,因为引入jpa,所以没有报错,但是项目开发过程中没有使用JPA相关的功能,清除掉此Maven依赖,项目也是正常运行,这种问题也是很难发现的,所以在开发过程中一定要注意代码的规范性,不要给自己留坑。
二、 解决方案
-
1、再把JPA的依赖恢复,但是我们不使用JPA的其他特性,没有必要因为这个引入此依赖
-
2、经过网上查找资料,在java8中 新增了-parameters 参数,开启此参数可以将编译后的 class 文件保留源码中的参数名称,而不是(arg0,arg1)。保留参数名称方便判断反射参数。在项目打包编译时在pom文件中添加编译参数
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<parameters>true</parameters>
</configuration>
</plugin>
</plugins>
</build>
本地一定先要clean,项目重新编译后生效,本地调试后可以兼容以前的写法,打包上线部署,项目正常运行。
参考链接:参考链接
参考链接2