项目场景:
提示:这里简述项目相关背景:
SpringCloud通过Feign接口调用远程微服务的时候出现了一个这样的异常
问题描述
提示:这里描述项目中遇到的问题:
在IDEA中做项目时,使用spring框架进行开发的时候在controller或者是再用eureka做Client接口时使用@PathVariable从链接链路中获取值的时候
例如:
@GetMapping("/{id}")
Result<List<Item>> getById(@PathVariable String id);
原因分析:
提示:这里填写问题的分析:
在使用idea编译时会报错java.lang.IllegalStateException: PathVariable annotation was empty on param 0.
这个报错时表示@PathVariable自动获取的参数名称和你给的链接链路中的名字没有对应,但是我们写的参数名和链接链路中获取的名字明明是一样的为什么会这样呢?
是因为在8以前的jdk版本的时候,我们利用反射只能获取到参数类型,然后参数名字都是利用arg0,arg1,arg2…所以在使用一些反射编程方面上不是很方便,jdk8开始开辟了这项function,但是我们正常情况下使用jvm不会默认保留参数名字。因为IDEA的编译版本不同会导致一些小的编译环境不同。
解决方案:
提示:这里填写该问题的具体解决方案:
大部分给的解决方式是在@PathVariable(“orderId”)的解决办法就想下面的代码一样
@GetMapping("/{id}")
Result<List<Item>> getById(@PathVariable("id") String id);
但是从jdk8后已经提供了新的方法之后可以通过idea的配置进行更改这种出错都是在idea生成的class文件中生成的代码是这样的
@GetMapping({"/{orderId}"})
Result<List<Item>> getById(@PathVariable String var1);
在idea中可以这样设置File→Settings→Build, Execution, Deployment→Compiler→JAVA Compiler里面添加-parameters,就可以使Java通过反射获取参数名啦
进入Java Compiler中在最下面的Override compiler parameters per-module:下方的表格中将你的所有module都添加上-parameters参数就可以使Java通过反射获取参数名啦
其实在需要反射的module中添加-parameters参数就可以了,但是为了防止后面对相关的module需要使用@PathVariable的情况建议都加上,然后找到这个项目的target把整个target都删除掉在重新运行idea代码就可以了,也可以使用maven找到相应的module名字点开找到Lifecycle里面找到clean也可以清除target在重新运行spring启动类就可以成功运行了,点开class文件发现idea已经成功映射了
注意:在没有手动删除target的时候或者是没有用maven进行clean清除编译好的class文件极大可能会导致继续报错,因为idea的发现你的代码没有变动不会对代码进行重新编译,会执行之前编译的class文件及出错的class文件需要删除后重写编译才会生成新的class文件