25

我用 Spring Boot 创建了一个简单的 Feign 客户端,如下所示:

@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

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

4

3 回答 3

29

Spring MVC 和 Spring cloud feign 都使用相同的 -namedParameterNameDiscovererDefaultParameterNameDiscoverer查找参数名称。它尝试通过以下步骤查找参数名称。

首先,它使用StandardReflectionParameterNameDiscoverer. 它试图通过反射找到变量名。仅当您的类使用-parameters.

其次,如果失败,它将使用LocalVariableTableParameterNameDiscoverer. 它尝试从带有 ASM 库的类文件中的调试信息中找到变量名。

Spring MVC 和 Feign 的区别就在这里。Feign@RequestParam在 Java 接口的方法上使用上述注解(如 )。但是,我们在使用 Spring MVC 时将这些用于 Java 类的方法。不幸的是,javac 编译器省略了java 接口类文件中参数名称的调试信息。这就是为什么 feign 无法找到没有-parameter.

也就是说,如果你用 编译你的代码-parameters,Spring MVC 和 Feign 都将成功获取参数名称。但是如果你不编译-parameters,只有 Spring MVC 会成功。

结果,这不是一个错误。我认为这是目前 Feign 的局限性。

于 2017-06-06T13:38:02.987 回答
25

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

    @FeignClient("spring-cloud-eureka-client")
    public interface GreetingClient {
       @RequestMapping("/greeting")
       String greeting(@RequestParam("name") String name);
    }
于 2018-08-30T14:03:38.603 回答
0

我使用升级 maven-compiler-plugin 来解决这个问题。您可以访问: https ://blog.51cto.com/thinklili/2566864

于 2020-12-19T03:44:52.083 回答