使用 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调用服务接口