使用 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
我创建了一个简单的 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