我创建了一个带有春季启动的简单假端客户端:
@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
首先,我不明白是什么原因,并且谷歌搜索了很多,但找不到答案。我几乎可以明确地发现,如果要明确编写请求param名称:
@RequestParam("name") String name
所以我的问题是:是一个错误还是可以配置为不明确编写请求参数名称?
Spring MVC和Spring Cloud Feign都使用相同的ParameterNameDiscoverer
-名为DefaultParameterNameDiscoverer
来查找参数名称。它试图通过以下步骤找到参数名称。
首先,它使用StandardReflectionParameterNameDiscoverer
。它试图找到具有反射的变量名称。只有在使用-parameters
编译的课程时才有可能。
第二,如果失败,它使用LocalVariableTableParameterNameDiscoverer
。它试图通过ASM库中的类文件中的调试信息找到可变名称。
这里发生了弹簧MVC和假s之间的差异。假装在Java接口方法上使用上述注释(例如@RequestParam
(。但是,使用Spring MVC时,我们将其用于Java类的方法。不幸的是,Javac编译器从 Java接口的类文件中省略了参数名称的调试信息。这就是为什么假装未能在没有-parameter
的情况下找到参数名称。
也就是说,如果您使用-parameters
编译代码,Spring MVC和Feign都将成功获取参数名称。但是,如果您没有-parameters
编译,则只有Spring MVC才能成功。
结果,这不是错误。正如我所想的那一刻,这是一个假装的限制。
只需使用String greeting(@RequestParam("name") String name);
@FeignClient("spring-cloud-eureka-client")
public interface GreetingClient {
@RequestMapping("/greeting")
String greeting(@RequestParam("name") String name);
}
这对我有用。
@FeignClient(name="session-service", url="${session.host}")
public interface SrocessingProxy {
@RequestMapping(value = "/process/{key}", method = RequestMethod.POST)
public Response processSession(@RequestParam String key, @RequestBody PayloadHolder payload);
}
//Service
@RequestMapping(value = "/process/{key}", method = RequestMethod.POST)
public Response processSession(@RequestParam String key, @RequestBody PayloadHolder payload) {
System.out.print("Key : " + key);
}
我用升级maven-compiler-plugin来解决此PLOBREM。您可以访问:https://blog.51cto.com/thinklili/2566864