La pratique OpenFeign fait que les requêtes GET dans l'interface Feign prennent en charge les paramètres POJO via l'annotation @SpringQueryMap

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 @QueryMapprennent 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 valuepropriétés.

Spring Cloud OpenFeign fournit des @SpringQueryMapannotations équivalentes pour annoter les paramètres POJO ou Map en tant que mappages de paramètres de requête.

Par exemple, RefundPaymentDtola classe définit des paramètres orderCodeet refundAmount:

@Data
public class RefundPaymentDto {
    /**
     * 订单号
     */
    private String orderCode;

    /**
     * 退款金额(单位:分)
     */
    private Integer refundAmount;
}
复制代码

Les faux clients suivants utilisent Paramscette 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 QueryMapEncoderbean personnalisé.

3. Résumé :

@SpringQueryMapL'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

Je suppose que tu aimes

Origine juejin.im/post/7079484202789371911
conseillé
Classement