使用 Spring 引导的假装客户端:RequestParam.value() 在参数 0 上为空

Feign Client with Spring Boot: RequestParam.value() was empty on parameter 0

我创建了一个简单的 Feign 客户端 Spring 像这样引导:

@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 MVC 和 Spring 云伪装都使用相同的 ParameterNameDiscoverer - 名为 DefaultParameterNameDiscoverer 来查找参数名称。它尝试通过以下步骤查找参数名称。

首先,它使用StandardReflectionParameterNameDiscoverer。它试图通过反射找到变量名。只有当你的 classes 是用 -parameters.

编译时才有可能

其次,如果失败,则使用LocalVariableTableParameterNameDiscoverer。它尝试从带有 ASM 库的 class 文件中的调试信息中查找变量名称。

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

的参数名称的原因

也就是说,如果你用-parameters编译你的代码,SpringMVC和Feign都会成功获取参数名。但是如果你在没有 -parameters 的情况下编译,只有 Spring MVC 会成功。

因此,这不是错误。我认为这是目前Feign的局限性。

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

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

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