使用Spring Boot假设客户端:RequestParam.value()在参数0上为空

问题描述 投票:8回答:2

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

所以我的问题是:它是一个错误还是可以配置为不明确写入请求参数名称?

spring spring-cloud spring-cloud-feign
2个回答
13
投票

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的限制。


11
投票

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

    @FeignClient("spring-cloud-eureka-client")
    public interface GreetingClient {
       @RequestMapping("/greeting")
       String greeting(@RequestParam("name") String name);
    }
© www.soinside.com 2019 - 2024. All rights reserved.