Feign 客户端 GET 请求,从微服务抛出“不允许方法:不支持请求方法‘POST’”

Fre*_*ntz 2 java spring-mvc spring-boot microservices feign

我有一个带有 spring 后端的 Vue.js 应用程序,它通过 Feign 客户端调用“订单”微服务。我有许多使用 @PathVariable(s) 工作正常的 GET 请求,但我有 1 个 GET 请求,它可以传递任意数量的不同 URL 参数,并定义了一个 OrderListItemParameters 类并将其添加到 GET 请求中,将参数传递给微服务。我可以看到请求正在发送到微服务,但它被拒绝,并出现“org.zalando.problem.spring.common.AdviceTrait:方法不允许:请求方法'POST'不支持”错误。

我已确保假客户端发送的 OrderListItemParameters 与微服务预期的 OrderListItemParameters 相匹配。无论是 Feign 客户端还是微服务中都没有提及 POST。我只有 GET 和 PUT 端点。

前端代码的 Java 后端:

@RestController
@RequestMapping("/api")
public class OrdersResource {

    ## THIS WORKS NO PROBLEM
    @GetMapping("/order/{orderId}")
    public @ResponseBody
    ResponseEntity<?> order(@PathVariable int orderId) throws Exception {
        return ResponseEntity.ok(orderClient.order(orderId));
    }


    ## THIS ENDPOINT IS THE ONE THAT FAILS
    @GetMapping("/order/list")
    public @ResponseBody
    ResponseEntity<?> orders(OrderListItemParameters orderListItemParams) {
        return ResponseEntity
           .ok(orderClient.getOrderList(orderListItemParams));
    }
}

@Component
@AuthorizedUserFeignClient(name = "orders")
public interface OrderClient {

    ## THIS WORKS NO PROBLEM
    @RequestMapping(method = RequestMethod.GET, value = "/api/order/pg/{orderId}")
    String order(@PathVariable("orderId") int orderId);

    ## THIS ENDPOINT IS THE ONE THAT FAILS
    @RequestMapping(method = RequestMethod.GET, value = "/api/order/list")
    String getOrderList(OrderListItemParameters orderListItemParams);
}
Run Code Online (Sandbox Code Playgroud)

作为 URL 参数传入的 OrderListItemParameters 类:(这在微服务中是相同的)

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderListItemParameters implements Serializable {

  private String searchPhrase;
  private String startDate;
  private String endDate;
  private ArrayList<String> sortKey;
  private ArrayList<String> sortValue;
  private Integer from;
  private Integer size;
}

(with getters, and setters) 
Run Code Online (Sandbox Code Playgroud)

微服务控制器:

@Controller
@RequestMapping("/api")
public class OrderController {

  ## THIS WORKS NO PROBLEM
  @GetMapping("/order/pg/{orderId}")
  public @ResponseBody
  Order pgorder(@PathVariable int orderId) {
    return orderService.getPgOrderById(orderId);
  }

  ## THIS ENDPOINT IS THE ONE THAT FAILS
  @GetMapping("/order/list")
  public @ResponseBody
  ResponseEntity getOrderListItemsByMerchant(OrderListItemParameters orderListItemParams) {
    return orderService
        .getOrderListItemsByMerchant(orderListItemParams);
}
Run Code Online (Sandbox Code Playgroud)

这是日志的图片:清楚地说明 GET 请求... 日志

任何帮助弄清楚为什么控制器认为这是一个 POST 请求的帮助都会很棒。

Fre*_*ntz 5

这是最终有效的解决方案......

#Resource
@GetMapping("/order/list")
public @ResponseBody 
ResponseEntity<?> getOrderListItemsByMerchant(
    @RequestParam Map<String, Object> params) {
    // method code
}

#Feign Client
@RequestMapping(method = RequestMethod.GET, value = "/api/order/list")
ResponseEntity<String> getOrderList(@RequestParam Map<String, Object> params);

#Microservice Controller
@GetMapping("/order/list")
public @ResponseBody
ResponseEntity getOrderListItemsByMerchant(OrderListItemParameters orderListItemParams) {
    // method code
}
Run Code Online (Sandbox Code Playgroud)

这允许我使用动态参数获取 URL,并且微服务仍然将请求视为 GET。

如果请求的两边都有相同的定义对象,那就太好了,但我根本无法使 @SpringQueryMap 或 @QueryMap 工作。

我讨厌费恩。