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

Igo*_*ock 11 spring spring-cloud spring-cloud-feign

我用Spring Boot创建了一个简单的Feign Client:

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

但是,当我尝试启动一个应用程序时,我收到一个错误:

java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0
Run Code Online (Sandbox Code Playgroud)

首先,我不明白是什么原因和谷歌搜索,但没有找到答案.几乎不可思议地我发现如果明确地写请求参数名称它是有效的:

@RequestParam("name") String name
Run Code Online (Sandbox Code Playgroud)

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

yon*_*oon 18

Spring MVC和Spring云假装都使用相同的ParameterNameDiscoverer命名DefaultParameterNameDiscoverer来查找参数名称.它尝试使用以下步骤查找参数名称.

首先,它使用StandardReflectionParameterNameDiscoverer.它试图用反射找到变量名.只有在编译类时才有可能-parameters.

其次,如果失败,它会使用LocalVariableTableParameterNameDiscoverer.它尝试使用ASM库从类文件中的调试信息中查找变量名称.

Spring MVC和Feign之间的区别在于此处.Feign @RequestParam在Java接口的方法上使用上面的注释(例如).但是,在使用Spring MVC时,我们在Java类的方法中使用它们.不幸的是,javac编译器从java接口的类文件中省略了参数名的调试信息.这就是为什么假装没有找到参数名称的原因-parameter.

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

结果,这不是一个错误.正如我想的那样,这是Feign的限制.


Jeb*_*bil 13

只是用 String greeting(@RequestParam("name") String name);

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