带有Spring Boot的Feign Client: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

首先,我不明白是什么原因,并且谷歌搜索了很多,但找不到答案。我几乎可以明确地发现,如果要明确编写请求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

相关内容

  • 没有找到相关文章

最新更新