带有Spring Boot的假客户端:参数0上的RequestParam.value()为空

n7taea2i  于 2022-10-04  发布在  Spring
关注(0)|答案(3)|浏览(201)

我用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

所以我的问题是:这是一个错误吗?或者它是否可以被配置为不显式地编写请求参数名称?

mwg9r5ms

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会成功。

因此,它不是一个错误。正如我所认为的,这是目前的一种伪装。

xcitsw88

xcitsw882#

只需使用String greeting(@RequestParam("name") String name);即可

@FeignClient("spring-cloud-eureka-client")
    public interface GreetingClient {
       @RequestMapping("/greeting")
       String greeting(@RequestParam("name") String name);
    }
kt06eoxx

kt06eoxx3#

我使用升级Maven-编译器-插件来解决这个问题。您可以访问:https://blog.51cto.com/thinklili/2566864

相关问题