Mybatis省略@Param导致的问题

背景

  • 历史原因导致,处理老项目的代码时候,清除了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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值