2017-06-01 117 views
3

我创建了一个简单的客户端假死和春天启动这样的:Fiegn客户端与Spring启动:RequestParam.value()是在参数空0

@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 

首先,我不明白是什么原因和谷歌搜索了很多,但没有找到答案。几乎excidentely我想通了,它的工作原理,如果写明确要求PARAM名称:

@RequestParam("name") String name 

所以我的问题:这是一个bug或者可以将其配置为不明确写入请求参数的名字呢?

+1

我认为需要有一个JVM设置,这样的参数名称可以用java使用8 – spencergibb

+0

@spencergibb它的工作原理,而不在同一个JVM的任何额外设置一个普通的弹簧安置控制器 – Igorock

回答

2

Spring MVC和Spring云假设都使用相同的ParameterNameDiscoverer - 名为DefaultParameterNameDiscoverer来查找参数名称。它尝试通过以下步骤查找参数名称。

首先,它使用StandardReflectionParameterNameDiscoverer。它试图通过反射来找到变量名称。只有在您的课程编制为-parameter时才有可能。

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

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

也就是说,如果你有-parameter编译代码,无论是Spring MVC和假死一定会成功收购参数名称。但是如果你编译没有-parameter,只有Spring MVC会成功。

其结果是,这不是一个错误。就像我想的那样,这是Feign的限制。