我用Spring Boot创建了一个简单的Feign Client:
@FeignClient("spring-cloud-eureka-client")
public interface GreetingClient {
@RequestMapping("/greeting")
String greeting(@RequestParam String name);
}
但是当我尝试启动一个应用程序时,我收到一个错误:
java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0
首先,我不明白是什么原因,谷歌搜索了很多,但没有找到答案。几乎不可思议地我发现如果明确地写请求参数名称它是有效的:
@RequestParam("name") String name
所以我的问题:它是一个错误还是可以配置为不明确写入请求参数名称?
答案 0 :(得分:12)
Spring MVC和Spring cloud feign都使用相同的ParameterNameDiscoverer
- 名为DefaultParameterNameDiscoverer
来查找参数名称。它尝试使用以下步骤查找参数名称。
首先,它使用StandardReflectionParameterNameDiscoverer
。它试图用反射找到变量名。只有在使用-parameters
编译类时才有可能。
其次,如果失败,则使用LocalVariableTableParameterNameDiscoverer
。它尝试使用ASM库从类文件中的调试信息中查找变量名称。
Spring MVC和Feign之间的区别在于此处。 Feign在Java接口的方法上使用上面的注释(如@RequestParam
)。但是,在使用Spring MVC时,我们在Java类的方法中使用它们。不幸的是,javac编译器从 java接口的类文件中省略了参数名称的调试信息。这就是为什么feign在没有-parameter
的情况下找不到参数名称的原因。
即,如果使用-parameters
编译代码,Spring MVC和Feign都将成功获取参数名称。但是如果你在没有-parameters
的情况下编译,只有Spring MVC会成功。
因此,它不是一个错误。正如我想的那样,这是Feign的限制。
答案 1 :(得分:9)
只需使用String greeting(@RequestParam("name") String name);
@FeignClient("spring-cloud-eureka-client")
public interface GreetingClient {
@RequestMapping("/greeting")
String greeting(@RequestParam("name") String name);
}
答案 2 :(得分:0)
我使用升级 maven-compiler-plugin 来解决这个问题。您可以访问:https://blog.51cto.com/thinklili/2566864