PathVariable annotation was empty on param 0..及@PathVariable编译后的.class文件参数名变为var1的解决办法

报错:java.lang.IllegalStateException: PathVariable annotation was empty on param 0.及@PathVariable编译后的.class文件参数名变为var1的解决办法

在IDEA中做项目时,使用spring框架进行开发的时候在controller或者是再用eureka做Client接口时使用@PathVariable从链接链路中获取值的时候
例如:

@GetMapping("/{orderId}")
JsonResult<List<Item>> getItems(@PathVariable String orderId);`

在使用idea编译时会报错java.lang.IllegalStateException: PathVariable annotation was empty on param 0.
这个报错时表示@PathVariable自动获取的参数名称和你给的链接链路中的名字没有对应,但是我们写的参数名和链接链路中获取的名字明明是一样的为什么会这样呢
是因为在8以前的jdk版本的时候,我们利用反射只能获取到参数类型,然后参数名字都是利用arg0,arg1,arg2…所以在使用一些反射编程方面上不是很方便,jdk8开始开辟了这项function,但是我们正常情况下使用jvm不会默认保留参数名字。但是因为IDEA的编译版本不同会导致一些小的编译环境不同,可以发现大部分给的解决方式是在@PathVariable(“orderId”)的解决办法就想下面的代码一样

@GetMapping("/{orderId}")
JsonResult<List<Item>> getItems(@PathVariable("orderId") String orderId);`

但是从jdk8后已经提供了新的方法之后可以通过idea的配置进行更改这种出错都是在idea生成的class文件中生成的代码是这样的

@GetMapping({"/{orderId}"})
JsonResult<List<Item>> getItems(@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文件

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值