PathVariable annotation was empty on param 0.问题解决
项目启动报错,提示信息如下:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.xxx.feign.StoreFeign': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: PathVariable annotation was empty on param 0.
上网查询了下,原来feign里边涉及到@PathVariable
和 @RequestParam的用法跟SpringMVC有所差别,总结起来就是:
- Spring MVC 控制器: 如果方法参数名和路径变量名或查询参数名相同,可以省略路径变量或查询参数的名称。
- Feign 客户端: 必须显式指定路径变量名或查询参数名,即使它们和方法参数名相同。
在Controller中使用@PathVariable
和 @RequestParam
注解用于从 HTTP 请求中提取参数,通常不需要指定路径变量名,Spring 会自动根据方法参数名来匹配 URL 路径中的变量名(如果参数名与路径变量名相同的话)。如果不同,才需要显式地指定路径变量名:
@GetMapping("/users/{userId}")
public User getUser(@PathVariable("userId") String id) {
// id对应路径变量userId
}
上面代码中路径变量名为userId,参数名为id,此时名称不一样,需要在@PathVariale中指定跟路径名一致,如果路径变量名与参数名一样,则@PathVariale不需要使用括号标注路径变量名:
@GetMapping("/users/{userId}")
public User getUser(@PathVariable String userId) {
}
@RequestParam
也是一样的道理,如果方法参数名和查询参数名相同,可以省略 @RequestParam
中的参数名:
@GetMapping("/users")
public User getUser(@RequestParam String id) {
// ...
}
但是在Feign 客户端中,@PathVariable
和 @RequestParam
的使用方式与 Spring MVC 中类似,但是在Feign 中的参数必须显式指定路径变量名或查询参数名,即使它们和方法参数名一致。Feign 不会自动根据参数名推断路径变量或查询参数的名称。因此在Feign进行微服务调用时,凡是使用@PathVariable
和 @RequestParam必须
显式指定变量名或查询参数名。要不然就会报开头的异常。