Feign调用GET接口触发Request method 'POST' is not supported异常求助
解决方案
核心问题分析
Feign默认会将GET请求中的复杂对象(如MyDto)识别为请求体,自动转为POST请求,而服务端仅配置了GET方法,因此抛出HttpRequestMethodNotSupportedException。同时Spring MVC接口上的参数注解不会自动继承到实现类,服务端也存在参数绑定的潜在问题。
步骤1:修正服务端实现类的参数注解
Spring MVC中,接口方法上的@RequestParam不会被实现类继承,需在实现类方法上显式添加该注解:
@RestController public class MyClientRestController implements MyClient { @Override public String getStuff(@RequestParam MyDto myDto) { return myDto.toString(); } }
步骤2:修改Feign接口,启用复杂对象转查询参数
使用Spring Cloud OpenFeign提供的@SpringQueryMap注解替换@RequestParam,该注解专门用于将DTO字段映射为URL查询参数:
public interface MyClient { @GetMapping(value = "mypath") String getStuff(@SpringQueryMap MyDto myDto); }
步骤3:修正FeignClient的路径配置
原FeignClient的path="/mypath"与接口的@GetMapping(value="mypath")会导致请求路径重复(最终为/mypath/mypath),需调整其中一个:
@FeignClient(name = "myserver", url = "${myurl}") public interface MyFeignClient extends MyClient {}
或修改接口的@GetMapping路径为空:
@GetMapping(value = "") String getStuff(@SpringQueryMap MyDto myDto);
备选方案(旧版本Spring Cloud)
若使用的Spring Cloud版本不支持@SpringQueryMap,可配置Feign使用SpringFormEncoder:
- 添加Maven依赖:
<dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.8.0</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.8.0</version> </dependency>
- 创建Feign配置类:
@Configuration public class FeignConfig { @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(); } }
- 在FeignClient上指定配置:
@FeignClient(name = "myserver", url = "${myurl}", configuration = FeignConfig.class) public interface MyFeignClient extends MyClient {}
验证
修改完成后,调用myFeignClient.getStuff(myDto)时,Feign会将MyDto的每个字段转为查询参数,发送GET请求到服务端,服务端可正确绑定参数。
内容的提问来源于stack exchange,提问作者ThCollignon
相关产品推荐
相关产品推荐

