问题:
线上的已经平稳运行的程序,有一天同事突然说不能运行了,报错如下
疑点:
我在我idea2021版本运行是没任何问题的,他是idea2017版本 根据报错信息,是没找到我feignClient中定义的参数,没找到@requestParam的参数
网上搜了下,有大量的博文,其实已经解释的很清楚了,feignClient和springMVC有名称的反射机制的不同,
使用Feign调用服务,参数前加@RequestParam启动时报错,原因是因为Feign解析不了参数,因为我们没有指定value,而在spring mvc中我们不指定value也可以编译是因为spring mvc在解析时,如果我们没有指定value时会通过反射的形式去获取参数名,将参数名指定为value
到这里,基本问题已经解决了,@RequestParam中加上name或者value名称即可,但是本人还是很好奇为什么idea2021不会出现这个问题呢, 后来拨云见雾开
解决
idea高版本是会在有默认的编译参数-parameters属性,而这个属性是干什么的呢, idea附带该属性编译时,就会编译出带参数名称的文件,当不加的时候,编译出的是(arg0,arg1)这样类似的参数;所以就会导致上边的问题发生
其实这个问题也会发生在mybatis的@param注解上,一样的道理
验证
-parameters参数究竟在编译的时候干了些什么 当我在idea2017中没加-parameters参数时
public static void main(String[] args) {
Method[] methods = DssApi.class.getMethods();
for (Method method : methods) {
if ("method".equals(method.getName())) {
Parameter[] parameters = method.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter.getName());
}
}
}
}
public static void method (int name,String age,Object password){
System.out.println("hell baby!");
}
运行结果 并没有拿到真正的参数名称
当加上-parameters时
如果你的项目里边@Param或者@RequestParam注解太多了, 全部去更改真的很麻烦 可以参考这位老哥的解决办法,一样适用 https://blog.51cto.com/thinklili/2566864
|