我用Spring Boot创建了一个简单的假客户端,如下所示:
@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
所以我的问题是:这是一个错误吗?或者它是否可以被配置为不显式地编写请求参数名称?
3条答案
按热度按时间mwg9r5ms1#
Spring MVC和Spring Cloud Feign都使用相同的
ParameterNameDiscoverer
-名为DefaultParameterNameDiscoverer
来查找参数名称。它尝试通过以下步骤查找参数名称。首先,它使用
StandardReflectionParameterNameDiscoverer
。它尝试使用反射来查找变量名。只有当您的类是用-parameters
编译的时候才有可能。其次,如果失败,则使用
LocalVariableTableParameterNameDiscoverer
。它试图从带有ASM库的类文件的调试信息中找到变量名。Spring MVC和Feign之间的区别就在这里。Feign在Java接口的方法上使用上述注解(如
@RequestParam
)。但是,当使用Spring MVC时,我们在Java类的方法上使用这些。遗憾的是,对于Java接口,javac编译器在类文件中省略了参数名的调试信息。这就是为什么Feign找不到没有-parameter
的参数名称的原因。也就是说,如果您使用
-parameters
编译代码,则Spring MVC和Feign都将成功获取参数名称。但如果不使用-parameters
进行编译,则只有Spring MVC会成功。因此,它不是一个错误。正如我所认为的,这是目前的一种伪装。
xcitsw882#
只需使用
String greeting(@RequestParam("name") String name);
即可kt06eoxx3#
我使用升级Maven-编译器-插件来解决这个问题。您可以访问:https://blog.51cto.com/thinklili/2566864