MyBatis 一个比较奇怪的参数绑定问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
anzu
V2EX    Java

MyBatis 一个比较奇怪的参数绑定问题

  •  
  •   anzu May 11, 2021 2940 views
    This topic created in 1814 days ago, the information mentioned may be changed or developed.

    众所周知如果 Mapper 需要多个参数时,需要在每个参数前加上 @ Param 注解,如:

    User findByUserIdAndName(@Param("userId") Integer userId, @Param("name") String name); 

    但是我不加也可以,于是我没加,正常运行。 现在重构项目,拆分成父子项目,结果全部报错:org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found. 网上都说是没加 @ Param 的原因,的确现在加上就不报错,但是为什么我之前没加也可以呢?

    Supplement 1    May 11, 2021

    我懂了! 根据这里的回答 https://stackoverflow.com/a/49316086

    To allow the input to be mapped to the operation method’s parameters, code implementing an endpoint should be compiled with -parameters. This will happen automatically if you are using Spring Boot’s Gradle plugin or if you are using Maven and spring-boot-starter-parent. 

    查看 spring-boot-starter-parent pom 文件,可以看到maven-compiler-plugin设置了 -parameters

    所以 spring 项目编译时会自动加上 -parameters

    但是,现在我重构了项目,删除了 spring-boot-starter-parent,把spring-boot-dependencies加入父项目的dependencyManagement,也就是

     <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <type>pom</type> <version>2.4.5</version> <scope>import</scope> </dependency> 

    但是这家伙没有设置 -parameters,于是查询报错

    6 replies    2021-05-12 12:13:16 +08:00
    qinxi
        1
    qinxi  
       May 11, 2021   1
    猜测: 之前编译保留了参数名, 拆分后编译参数名被抹去了
    msaionyc
        2
    msaionyc  
       May 11, 2021   1
    https://www.codenong.com/cs110818507/
    感觉是这个原因,之前也有遇到过,但没有去深入了解
    mitsuizzz
        3
    mitsuizzz  
       May 11, 2021   1
    之前遇到过这个问题,网上查了很久,千奇百怪的。
    最后发现是编译设定有关,本地 ide 默认给你加了个-parameters 参数导致编译保留了参数名不会报错。
    详情参考:
    https://www.concretepage.com/java/jdk-8/java-8-reflection-access-to-parameter-names-of-method-and-constructor-with-maven-gradle-and-eclipse-using-parameters-compiler-argument#compiler-argument
    shoushi
        4
    shoushi  
       May 11, 2021
    是我之前遇到的问题了!多谢
    yhpz
        5
    yhpz  
       May 11, 2021
    可以看下 MyBatis 源码中 ParamNameResolver 这个类:
    for (Annotation annotation : paramAnnotations[paramIndex]) {
    // 方法参数中,是否有 Param 注解
    if (annotation instanceof Param) {
    hasParamAnnotation = true;
    // 获取参数名称
    name = ((Param) annotation).value();
    break;
    }
    }
    if (name == null) {
    // 未指定 @Param 注解,这判断是否使用实际的参数名称,参考 useActualParamName 属性的作用,IDEA 需要加 -parameters 参数
    if (config.isUseActualParamName()) {
    // 获取参数名
    name = getActualParamName(method, paramIndex);
    }
    if (name == null) {
    name = String.valueOf(map.size());
    }
    }
    siweipancc
        6
    siweipancc  
       May 12, 2021 via iPhone
    啊这……spring cache 一章有讲,还加红了
    About     Help     Advertise     Blog     API     FAQ     Solana     5427 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 08:16 < href="/worldclock#pvg">PVG 16:16 LAX 01:16 JFK 04:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86