OpenFeign 实践通过 @SpringQueryMap 注解让Feign 接口中的 GET 请求支持 POJO 参数

简介: OpenFeign 实践通过 @SpringQueryMap 注解让Feign 接口中的 GET 请求支持 POJO 参数

一、问题描述:


一句话概括:我们的 FeignClient 接口在 GET 请求下支持 POJO 参数?


如果我们调用放的接口是一个 GET 请求,如果我们是用 @FeignClient 直接定义 POJO 参数如下代码:


@FeignClient(name = "payment-service", contextId = "payment-core", path = "/payment")
public interface PaymentFeign {
    @GetMapping("/refund")
    RefundPaymentVo refund(RefundPaymentDto refundPaymentDto);
}


就会报下面的错误信息:


feign.FeignException$MethodNotAllowed: [405] during [GET] to [http://payment-service/payment/refund] [PaymentFeign#refund(RefundPaymentDto)]: [{"timestamp":"2022-03-26T18:34:47.058+00:00","status":405,"error":"Method Not Allowed","path":"/payment/refund"}]
  at feign.FeignException.clientErrorStatus(FeignException.java:221)
  at feign.FeignException.errorStatus(FeignException.java:194)
  at feign.FeignException.errorStatus(FeignException.java:185)
  at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:92)
  at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:96)
  at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
  at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89)
  at org.springframework.cloud.openfeign.FeignCircuitBreakerInvocationHandler.lambda$asSupplier$1(FeignCircuitBreakerInvocationHandler.java:112)
  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  at java.lang.Thread.run(Thread.java:748)


二、解决方法:


OpenFeign@QueryMap注解支持将 POJO 用作 GET 参数映射。不幸的是,默认的 OpenFeign QueryMap 注解与 Spring 不兼容,因为它缺少value属性。


Spring Cloud OpenFeign 提供了等效的@SpringQueryMap注解,用于将 POJO 或 Map 参数注解为查询参数映射。


例如,RefundPaymentDto该类定义参数orderCoderefundAmount


@Data
public class RefundPaymentDto {
    /**
     * 订单号
     */
    private String orderCode;
    /**
     * 退款金额(单位:分)
     */
    private Integer refundAmount;
}


以下 feign 客户端通过注解使用Params该类:@SpringQueryMap


@FeignClient(name = "payment-service", contextId = "payment-core", path = "/payment")
public interface PaymentFeign {
    @GetMapping("/refund")
    RefundPaymentVo refund(@SpringQueryMap RefundPaymentDto refundPaymentDto);
}


如果您需要对生成的查询参数映射进行更多控制,可以实现自定义QueryMapEncoderbean。


三、总结:


@SpringQueryMap 注解的使用,简化了我们在 FeignClient 中 GET 参数的复杂定义(如果我们单个定义只能使用 @RequestParam


参考资料:1. Spring Cloud OpenFeign 官方文档


相关文章
|
Java Spring
Spring Cloud OpenFeign 远程调用传递请求头信息
import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; import org.springframework.util.Assert; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;
299 0
|
Dubbo Java 数据库连接
利用FactoryBean接口实例化,来实现dubbo接口调用和mybatis接口调用
Java编程规范中声明,Java接口类是不能直接实例化的,但是我们在平时的开发中经常会遇到只声明接口就可以直接使用的。 eg: 1. Mybatis中只用使用`@MapperScan`声明要扫描的Mapper接口类就可以直接从Spring中获取使用,进行操作数据库 2. Dubbo中只要用Dubbo提供的`@Service`注解,同样可以直接从Spring中获取使用进行远程调用。
405 0
|
5月前
|
Java Spring
springboot使用RestTemplate(基于2.6.7,返回泛型)
springboot使用RestTemplate(基于2.6.7,返回泛型)
|
6月前
|
Java
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
|
6月前
|
Java
解决springboot添加拦截器之后只能获取一次流,并且@requestbody注解和表单方式都可以接到参
解决springboot添加拦截器之后只能获取一次流,并且@requestbody注解和表单方式都可以接到参
|
6月前
|
数据中心
Feign调用
Feign调用
33 0
|
设计模式 JSON 前端开发
2021-08-11Spring MVC,入门项目搭建及流程,springMVC的适配器和映射器,基于注解的controller,映射请求,方法返回值,requestmapping注解
2021-08-11Spring MVC,入门项目搭建及流程,springMVC的适配器和映射器,基于注解的controller,映射请求,方法返回值,requestmapping注解
58 0
|
Java Spring
Spring - BeanDefinitionRegistryPostProcessor 扩展接口 动态注册bean
BeanDefinitionRegistryPostProcessor 扩展接口 动态注册bean
106 0
Spring - BeanDefinitionRegistryPostProcessor 扩展接口 动态注册bean
|
负载均衡 Nacos
一起用feign来调用接口(有源码)
nacos很好的兼容了feign,feign默认集成了Ribbon,所以Nacos下使用Feign就默认实现了负载均衡 一、测试结果
131 0
一起用feign来调用接口(有源码)