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

Posted

技术标签:

【中文标题】使用 Spring Boot 的 Feign 客户端:RequestParam.value() 在参数 0 上为空【英文标题】:Feign Client with Spring Boot: RequestParam.value() was empty on parameter 0 【发布时间】:2017-11-02 22:52:46 【问题描述】:

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

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

【问题讨论】:

我相信需要有一个 jvm 设置,以便参数名称可以与 java 8 一起使用。 @spencergibb 对于普通的 Spring 休息控制器,它无需在同一个 jvm 上进行任何其他设置即可工作 【参考方案1】:

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

【讨论】:

一个小的添加它的 -parameters 以 s 结尾。 Spring Boot 2 的 Maven 解决方案:***.com/questions/31845676/…【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于使用 Spring Boot 的 Feign 客户端:RequestParam.value() 在参数 0 上为空的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot feign 客户端进行 Oauth2 身份验证?

Spring boot Oauth2:使用 Feign、Ribbon、Zull 和 Eureka 从客户端到资源的令牌中继

Spring Boot 2 - 自动装配服务时对 Feign 客户端的不满意依赖

在 Spring Boot 中安排 OAuth + Feign

spring boot Open Feign 客户端加载过程

(22)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-使用Feign调用服务接口