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 官方文档


相关文章
|
2月前
|
存储 JSON Java
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
74 2
|
9月前
|
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;
236 0
|
Dubbo Java 数据库连接
利用FactoryBean接口实例化,来实现dubbo接口调用和mybatis接口调用
Java编程规范中声明,Java接口类是不能直接实例化的,但是我们在平时的开发中经常会遇到只声明接口就可以直接使用的。 eg: 1. Mybatis中只用使用`@MapperScan`声明要扫描的Mapper接口类就可以直接从Spring中获取使用,进行操作数据库 2. Dubbo中只要用Dubbo提供的`@Service`注解,同样可以直接从Spring中获取使用进行远程调用。
337 0
|
2月前
|
Java
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
|
11月前
|
设计模式 JSON 前端开发
2021-08-11Spring MVC,入门项目搭建及流程,springMVC的适配器和映射器,基于注解的controller,映射请求,方法返回值,requestmapping注解
2021-08-11Spring MVC,入门项目搭建及流程,springMVC的适配器和映射器,基于注解的controller,映射请求,方法返回值,requestmapping注解
48 0
|
JSON 前端开发 Java
Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求
Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求
158 0
|
Java 微服务 Spring
springcloud @EnableDiscoveryClient注解作用
springcloud @EnableDiscoveryClient注解作用
184 0
|
前端开发 Java API
Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象
Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet API对象
259 0
|
Java 微服务 Spring
FeignClient注解及参数问题---SpringCloud微服务
在用分布式架构SpringBoot的SpringCloud技术开发过程中,FeignClient 是一个常用的注解,且很重要的功能
211 0