L'offre arrive, creusez des amis pour ramasser! Je participe à l'événement de vérification du recrutement du printemps 2022, cliquez pour voir les détails de l'événement .
1. Description du problème :
En une phrase : notre interface FeignClient prend-elle en charge les paramètres POJO sous les requêtes GET ?
Si l'interface que nous appelons est une requête GET, si nous utilisons @FeignClient pour définir directement les paramètres POJO, le code est le suivant :
@FeignClient(name = "payment-service", contextId = "payment-core", path = "/payment")
public interface PaymentFeign {
@GetMapping("/refund")
RefundPaymentVo refund(RefundPaymentDto refundPaymentDto);
}
复制代码
Le message d'erreur suivant sera signalé :
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)
复制代码
Deuxièmement, la solution :
Les annotations OpenFeign @QueryMap
prennent en charge l'utilisation des POJO comme mappages de paramètres GET. Malheureusement, l'annotation OpenFeign QueryMap par défaut n'est pas compatible avec Spring car elle manque de value
propriétés.
Spring Cloud OpenFeign fournit des @SpringQueryMap
annotations équivalentes pour annoter les paramètres POJO ou Map en tant que mappages de paramètres de requête.
Par exemple, RefundPaymentDto
la classe définit des paramètres orderCode
et refundAmount
:
@Data
public class RefundPaymentDto {
/**
* 订单号
*/
private String orderCode;
/**
* 退款金额(单位:分)
*/
private Integer refundAmount;
}
复制代码
Les faux clients suivants utilisent Params
cette classe via l'annotation :@SpringQueryMap
@FeignClient(name = "payment-service", contextId = "payment-core", path = "/payment")
public interface PaymentFeign {
@GetMapping("/refund")
RefundPaymentVo refund(@SpringQueryMap RefundPaymentDto refundPaymentDto);
}
复制代码
Si vous avez besoin de plus de contrôle sur le mappage des paramètres de requête générés, vous pouvez implémenter un QueryMapEncoder
bean personnalisé.
3. Résumé :
@SpringQueryMap
L'utilisation d'annotations simplifie notre définition complexe des paramètres GET dans FeignClient (si nous ne pouvons utiliser qu'une seule définition @RequestParam
)
Références : 1. Documentation officielle Spring Cloud OpenFeign